This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr-mcp.git


The following commit(s) were added to refs/heads/main by this push:
     new e460042  docs(site): host MCP documentation content in-repo, deployed 
to solr-site at build time (#143)
e460042 is described below

commit e460042b0471bbc96510921fb2a7b26b05f1f091
Author: Aditya Parikh <[email protected]>
AuthorDate: Fri Sep 11 09:53:55 2026 -0400

    docs(site): host MCP documentation content in-repo, deployed to solr-site 
at build time (#143)
    
    * docs(site): add MCP documentation content as source of truth
    
    Move the MCP documentation pages (Markdown) and the DOAP descriptor into
    docs/site/content/ so that documentation travels with the code: every 
feature
    PR can update its docs in the same review.
    
    The Solr site's presentation layer (Pelican templates, theme, CSS, 
pelicanconf)
    stays in apache/solr-site; at build time solr-site fetches this content 
into its
    Pelican content/ tree before rendering, so the MCP pages keep the shared 
site
    theme and their published URLs are unchanged. See docs/site/README.md.
    
    Companion to the apache/solr-site change that adds the fetch step to 
build.sh
    and the Pelican CI workflows and removes the now-sourced-here content.
    
    Also adds the design doc covering this and the binary LICENSE/NOTICE 
tooling.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    * docs(spec): update LICENSE/NOTICE design to the SBOM-driven buildSrc 
approach
    
    The Deliverable 1 section described the earlier jk1 
dependency-license-report
    plan (plugin appendix + hand-kept SolrJ supplement + checkLicense). Update 
it to
    what shipped in PR #138: the appendix is derived from the CycloneDX SBOM 
(#142),
    implemented as the org.apache.solr.mcp.license-notice convention plugin in
    buildSrc with typed, unit-tested GenerateBinaryLicense/GenerateBinaryNotice
    tasks and a config/license-policy.json (allowedLicenses + overrides) gate.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    * docs(spec): drop license-policy from LICENSE design (disclose SBOM as-is)
    
    Match PR #138: removed config/license-policy.json and the 
allow-list/override
    gate; the appendix now discloses SBOM-reported licenses verbatim with a
    completeness-only gate.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    * docs(site): add a Licensing & Notices page
    
    New MCP docs-site page covering the project's LICENSE/NOTICE: the source vs
    binary split, where the binary files live (the executable JAR's META-INF 
and the
    Docker images built from it), how to build them, how they're constructed 
(the
    SBOM-derived LICENSE appendix and the aggregated dependency NOTICE), and 
the role
    of the CycloneDX SBOM as the complementary machine-readable inventory.
    
    Linked from the Resources page Guides list. The page template lives in
    apache/solr-site (themes/solr/templates/mcp/licensing.html) per the
    content/presentation split.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    * docs(site): fix client config + security accuracy in MCP pages
    
    Three factual fixes surfaced while reviewing the README polish (#147/#151),
    which the website source pages share:
    
    - clients/jetbrains.md: Junie's project MCP config lives at
      `.junie/mcp/mcp.json` (nested `mcp/` dir), not `.junie/mcp.json`.
    - clients/vs-code.md: the `/mcp` endpoint is Streamable HTTP, so the
      VS Code server entry needs `"type": "http"`, not the legacy `"sse"`.
    - security.md: HTTP mode is **secured by default**
      (`http.security.enabled` defaults to true). Corrected the "disabled by
      default" framing and removed the non-existent `SECURITY_ENABLED` toggle;
      the issuer (`OAUTH2_ISSUER_URI`) is what you set to use auth, and
      `HTTP_SECURITY_ENABLED=false` disables it for local dev.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    * docs(site): fix `claude mcp add` syntax and broken doc links
    
    - clients/claude-code.md: the `claude mcp add` CLI examples and the
      explanation were wrong. Per `claude mcp add --help`, the form is
      `claude mcp add [options] <name> <commandOrUrl> [args...]` — the server
      name comes first and, for STDIO, `--` goes AFTER the name and any `-e`
      options (`-e` stops at the `--`). HTTP needs no `--`. Corrected all three
      examples (`solr-mcp ... -- <command>`; `--transport http solr-mcp <url>`)
      and rewrote the misleading "`--` before the name / `-e` is greedy" note.
    
    - security.md & resources.md: the Auth0/Keycloak/Architecture/Development
      links pointed at `docs/development/*` (the abandoned #95 layout, which
      never existed on main). Repointed to the real 1.0.0 locations:
      `docs/security/auth0.md`, `docs/security/keycloak.md`,
      `dev-docs/ARCHITECTURE.md`, `dev-docs/DEVELOPMENT.md`.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    * docs(site): Linux Docker note on all clients; Solr versions; completions
    
    Brings the website source to parity with the README/dev-docs fixes:
    
    - clients/{cursor,jetbrains,claude-code,mcp-inspector}.md: add the Linux
      `--add-host=host.docker.internal:host-gateway` note to their Docker
      examples (Claude Desktop already had it) so the container can reach a
      host Solr on Linux.
    - quick-start.md: note Solr version compatibility (8.11–10, tested matrix)
      in Prerequisites, and add a Tip that MCP completions autocomplete
      collection names for the schema resource and the prompt arguments.
    
    Note: the rendered Features page lists tools/resources/prompts from the
    `mcp/features` template in apache/solr-site; adding a "Completions" entry
    there is a parallel solr-site change.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
    Signed-off-by: adityamparikh <[email protected]>
    
    ---------
    
    Signed-off-by: adityamparikh <[email protected]>
    Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
---
 docs/site/README.md                                |  55 +++++++
 docs/site/content/doap/solr-mcp.rdf                |  52 ++++++
 docs/site/content/pages/mcp/clients/claude-code.md | 114 ++++++++++++++
 .../content/pages/mcp/clients/claude-desktop.md    | 110 +++++++++++++
 docs/site/content/pages/mcp/clients/cursor.md      |  75 +++++++++
 docs/site/content/pages/mcp/clients/jetbrains.md   |  78 +++++++++
 .../content/pages/mcp/clients/mcp-inspector.md     |  59 +++++++
 docs/site/content/pages/mcp/clients/vs-code.md     |  85 ++++++++++
 docs/site/content/pages/mcp/community.md           |  42 +++++
 docs/site/content/pages/mcp/downloads.md           |   5 +
 docs/site/content/pages/mcp/features.md            |   4 +
 docs/site/content/pages/mcp/index.md               |   4 +
 docs/site/content/pages/mcp/licensing.md           |  98 ++++++++++++
 docs/site/content/pages/mcp/observability.md       | 114 ++++++++++++++
 docs/site/content/pages/mcp/quick-start.md         | 132 ++++++++++++++++
 docs/site/content/pages/mcp/resources.md           |  48 ++++++
 docs/site/content/pages/mcp/security.md            | 175 +++++++++++++++++++++
 ...-06-09-license-notice-and-docs-deploy-design.md | 161 +++++++++++++++++++
 18 files changed, 1411 insertions(+)

diff --git a/docs/site/README.md b/docs/site/README.md
new file mode 100644
index 0000000..99de379
--- /dev/null
+++ b/docs/site/README.md
@@ -0,0 +1,55 @@
+# Solr MCP documentation site content
+
+This directory is the **source of truth** for the Apache Solr MCP 
documentation that
+is published on the Solr website at <https://solr.apache.org/mcp/>.
+
+Keeping the content here means every feature PR can update its documentation 
alongside
+the code change, in the same review.
+
+## What lives here
+
+```
+docs/site/content/
+├── pages/mcp/**        Markdown pages (one file per published page)
+└── doap/solr-mcp.rdf   DOAP project descriptor
+```
+
+These are plain [Pelican](https://getpelican.com/) content files. Each page 
carries
+front-matter that selects a template, e.g.:
+
+```
+Title: Quick Start
+URL: mcp/quick-start.html
+save_as: mcp/quick-start.html
+template: mcp/quick-start
+```
+
+## How it gets published (assembly at build time)
+
+The **presentation layer** (Pelican templates, theme, CSS, `pelicanconf.py`) 
lives in
+the [`apache/solr-site`](https://github.com/apache/solr-site) repository, not 
here, so
+the MCP pages share the rest of the Solr site's look and feel.
+
+At site-build time, `solr-site` fetches this directory at a pinned ref and 
copies it
+into its Pelican `content/` tree before running `pelican content -o output`:
+
+- `content/pages/mcp/**` ← `docs/site/content/pages/mcp/**`
+- `content/doap/solr-mcp.rdf` ← `docs/site/content/doap/solr-mcp.rdf`
+
+This is wired in `solr-site`'s `build.sh` (local preview) and its Pelican 
GitHub
+Actions workflows (`build-pelican.yml`, `pr-build-pelican.yml`). The published 
URLs are
+unchanged from when the content lived in `solr-site` directly.
+
+## Editing and previewing
+
+- **Edit** the Markdown here; that is all most doc changes require.
+- **Preview** with the full Solr theme by running `solr-site`'s `./build.sh 
-l` with a
+  sibling `solr-mcp` checkout — the build picks up 
`../solr-mcp/docs/site/content`
+  automatically when present, otherwise it clones the pinned ref.
+
+## Why content here, theme there
+
+A standalone build in this repo would have to vendor the Solr Pelican theme 
and would
+drift from the rest of the site. Splitting **content (here)** from 
**presentation
+(`solr-site`)** keeps a single themed build while letting documentation travel 
with the
+code — mirroring how the Solr Reference Guide is assembled into the site.
diff --git a/docs/site/content/doap/solr-mcp.rdf 
b/docs/site/content/doap/solr-mcp.rdf
new file mode 100644
index 0000000..40faa36
--- /dev/null
+++ b/docs/site/content/doap/solr-mcp.rdf
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl"?>
+<rdf:RDF xml:lang="en"
+         xmlns="http://usefulinc.com/ns/doap#"; 
+         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
+         xmlns:asfext="http://projects.apache.org/ns/asfext#";
+         xmlns:foaf="http://xmlns.com/foaf/0.1/";>
+<!--
+    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
+   
+         https://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.
+-->
+  <Project rdf:about="https://solr.apache.org/mcp";>
+    <created>2025-10-26</created>
+    <license rdf:resource="https://spdx.org/licenses/Apache-2.0"; />
+    <name>Apache Solr MCP Server</name>
+    <homepage rdf:resource="https://solr.apache.org/mcp"; />
+    <asfext:pmc rdf:resource="https://solr.apache.org"; />
+    <shortdesc>Model Context Protocol server for Apache Solr</shortdesc>
+    <bug-database rdf:resource="https://github.com/apache/solr-mcp/issues"; />
+    <mailing-list 
rdf:resource="https://solr.apache.org/community.html#mailing-lists-chat"; />
+    <download-page rdf:resource="https://solr.apache.org/mcp/downloads.html"; />
+    <programming-language>Java</programming-language>
+    <category rdf:resource="https://projects.apache.org/category/cloud"; />
+    <category rdf:resource="https://projects.apache.org/category/search"/>
+    <category rdf:resource="https://projects.apache.org/category/java"/>
+    <repository>
+      <GitRepository>
+        <location 
rdf:resource="https://gitbox.apache.org/repos/asf/solr-mcp.git"/>
+        <browse 
rdf:resource="https://gitbox.apache.org/repos/asf?p=solr-mcp.git"/>
+      </GitRepository>
+    </repository>
+    <maintainer>
+      <foaf:Person>
+        <foaf:name>Apache Solr Team</foaf:name>
+          <foaf:mbox rdf:resource="mailto:[email protected]"/>
+      </foaf:Person>
+    </maintainer>
+    <!-- NOTE: please insert releases in numeric order, NOT chronologically. 
-->
+  </Project>
+</rdf:RDF>
diff --git a/docs/site/content/pages/mcp/clients/claude-code.md 
b/docs/site/content/pages/mcp/clients/claude-code.md
new file mode 100644
index 0000000..decf18b
--- /dev/null
+++ b/docs/site/content/pages/mcp/clients/claude-code.md
@@ -0,0 +1,114 @@
+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.
+
+***
+
+## CLI Syntax ##
+
+The general form of `claude mcp add` is (see [Claude Code MCP 
docs](https://code.claude.com/docs/en/mcp)):
+
+```bash
+claude mcp add [options] <name> <commandOrUrl> [args...]
+```
+
+The server `<name>` comes first. For a **STDIO** server, pass any `-e 
KEY=value` options (repeatable) after the name, then `--`, then the launch 
command. The `--` stops Claude Code from reparsing the server's own flags as 
its own options, and `-e` stops consuming tokens at the `--`:
+
+```bash
+claude mcp add <name> -e KEY=value -- <command> [args...]
+```
+
+For an **HTTP** server, no `--` is needed — pass the URL with `--transport 
http`:
+
+```bash
+claude mcp add --transport http <name> <url>
+```
+
+***
+
+## STDIO Mode (Recommended) ##
+
+### CLI ###
+
+```bash
+# JAR
+claude mcp add solr-mcp \
+    -e SOLR_URL=http://localhost:8983/solr/ \
+    -- java -jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar
+
+# Docker (local image — build first with ./gradlew jibDockerBuild)
+claude mcp add 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": {
+    "solr-mcp": {
+      "type": "stdio",
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest"]
+    }
+  }
+}
+```
+
+**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the 
`args` array.
+
+***
+
+## 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/docs/site/content/pages/mcp/clients/claude-desktop.md 
b/docs/site/content/pages/mcp/clients/claude-desktop.md
new file mode 100644
index 0000000..e849131
--- /dev/null
+++ b/docs/site/content/pages/mcp/clients/claude-desktop.md
@@ -0,0 +1,110 @@
+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.
+
+### JAR ###
+
+Requires Java 25+ and a [built 
JAR](https://github.com/apache/solr-mcp#running-the-server) (`./gradlew build`).
+
+```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 the image first: `./gradlew jibDockerBuild`
+
+```json
+{
+  "mcpServers": {
+    "solr-mcp": {
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest"]
+    }
+  }
+}
+```
+
+**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the 
`args` array.
+
+***
+
+## 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
+# 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 ###
+
+```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&mdash;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/docs/site/content/pages/mcp/clients/cursor.md 
b/docs/site/content/pages/mcp/clients/cursor.md
new file mode 100644
index 0000000..73a420f
--- /dev/null
+++ b/docs/site/content/pages/mcp/clients/cursor.md
@@ -0,0 +1,75 @@
+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:
+
+**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 &mdash; build first with `./gradlew jibDockerBuild`):**
+
+```json
+{
+  "mcpServers": {
+    "solr-mcp": {
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest"]
+    }
+  }
+}
+```
+
+**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the 
`args` array.
+
+### Cursor Settings UI ###
+
+1. Open **Cursor Settings** (gear icon or <kbd>Cmd+,</kbd> / <kbd>Ctrl+,</kbd>)
+2. Navigate to **Features** > **MCP Servers**
+3. Click **Add New MCP Server**
+4. Enter:
+    * **Name**: `solr-mcp`
+    * **Type**: `command`
+    * **Command**: `java -jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar`
+
+***
+
+## 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/docs/site/content/pages/mcp/clients/jetbrains.md 
b/docs/site/content/pages/mcp/clients/jetbrains.md
new file mode 100644
index 0000000..db42ce8
--- /dev/null
+++ b/docs/site/content/pages/mcp/clients/jetbrains.md
@@ -0,0 +1,78 @@
+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/mcp.json`) ###
+
+Create `.junie/mcp/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 &mdash; build first with `./gradlew jibDockerBuild`):**
+
+```json
+{
+  "mcpServers": {
+    "solr-mcp": {
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest"]
+    }
+  }
+}
+```
+
+**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the 
`args` array.
+
+### IDE Settings ###
+
+1. Open **Settings** (<kbd>Cmd+,</kbd> / <kbd>Ctrl+Alt+S</kbd>)
+2. Navigate to **Tools** > **AI Assistant** > **MCP Servers**
+3. Click **Add** (`+`)
+4. Configure:
+    * **Name**: `solr-mcp`
+    * **Transport**: `STDIO`
+    * **Command**: `java`
+    * **Arguments**: `-jar /absolute/path/to/solr-mcp-1.0.0-SNAPSHOT.jar`
+
+***
+
+## 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/docs/site/content/pages/mcp/clients/mcp-inspector.md 
b/docs/site/content/pages/mcp/clients/mcp-inspector.md
new file mode 100644
index 0000000..5dc72f6
--- /dev/null
+++ b/docs/site/content/pages/mcp/clients/mcp-inspector.md
@@ -0,0 +1,59 @@
+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`.
+
+***
+
+## 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:
+
+        # 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**
+
+**Linux users** (Docker option): add 
`--add-host=host.docker.internal:host-gateway` to the `docker run` command.
+
+***
+
+## 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/docs/site/content/pages/mcp/clients/vs-code.md 
b/docs/site/content/pages/mcp/clients/vs-code.md
new file mode 100644
index 0000000..081cff2
--- /dev/null
+++ b/docs/site/content/pages/mcp/clients/vs-code.md
@@ -0,0 +1,85 @@
+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:
+
+**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 &mdash; build first with `./gradlew jibDockerBuild`):**
+
+```json
+{
+  "servers": {
+    "solr-mcp": {
+      "type": "stdio",
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest"]
+    }
+  }
+}
+```
+
+### User Settings (`settings.json`) ###
+
+Open VS Code Settings (JSON) and add:
+
+```json
+{
+  "mcp": {
+    "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/"; }
+      }
+    }
+  }
+}
+```
+
+***
+
+## 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": "http",
+      "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/docs/site/content/pages/mcp/community.md 
b/docs/site/content/pages/mcp/community.md
new file mode 100644
index 0000000..e2e5b9a
--- /dev/null
+++ b/docs/site/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: <https://the-asf.slack.com/archives/C09TVG3BM1P>
+
+## 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/docs/site/content/pages/mcp/downloads.md 
b/docs/site/content/pages/mcp/downloads.md
new file mode 100644
index 0000000..8e59896
--- /dev/null
+++ b/docs/site/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/docs/site/content/pages/mcp/features.md 
b/docs/site/content/pages/mcp/features.md
new file mode 100644
index 0000000..6e96e5e
--- /dev/null
+++ b/docs/site/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/docs/site/content/pages/mcp/index.md 
b/docs/site/content/pages/mcp/index.md
new file mode 100644
index 0000000..b9d9a79
--- /dev/null
+++ b/docs/site/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/docs/site/content/pages/mcp/licensing.md 
b/docs/site/content/pages/mcp/licensing.md
new file mode 100644
index 0000000..d1bcb8f
--- /dev/null
+++ b/docs/site/content/pages/mcp/licensing.md
@@ -0,0 +1,98 @@
+Title: Licensing & Notices
+URL: mcp/licensing.html
+save_as: mcp/licensing.html
+template: mcp/licensing
+
+## Overview ##
+
+Apache Solr MCP Server is licensed under the **Apache License 2.0**. Because 
the project is distributed in two different forms, it ships two different pairs 
of `LICENSE` and `NOTICE` files, each describing what is actually in that form:
+
+| Form | Artifacts | Contains | LICENSE / NOTICE |
+|------|-----------|----------|------------------|
+| **Source** | the source tree, `-sources` / `-javadoc` jars | only 
Apache-authored code | the base Apache-2.0 `LICENSE` + a minimal `NOTICE` |
+| **Binary** | the executable (fat) JAR and the Docker images built from it | 
Apache code **plus** every bundled third-party dependency | the base files 
**extended** with each bundled dependency's license and the notices those 
dependencies require |
+
+This split follows the [ASF licensing 
how-to](https://infra.apache.org/licensing-howto.html): a binary that bundles 
other projects' code must tell recipients the license of every bundled 
component, and must carry forward the attribution notices those components 
require. The source release, which contains only Apache-authored code, needs 
only the base files.
+
+***
+
+## Where the Files Live ##
+
+The **binary** `LICENSE` and `NOTICE` are bundled inside the executable JAR's 
`META-INF/` directory, so they travel with every distribution:
+
+* **Executable JAR** &mdash; `META-INF/LICENSE` and `META-INF/NOTICE` inside 
`solr-mcp-<version>.jar`.
+* **Docker images** &mdash; the same files, since both the Jib JVM image and 
the native images package the JAR's contents. They are present on the classpath 
at `META-INF/` in the running container.
+
+To read them straight out of a built artifact:
+
+```bash
+unzip -p solr-mcp-<version>.jar META-INF/LICENSE
+unzip -p solr-mcp-<version>.jar META-INF/NOTICE
+```
+
+The **source** `LICENSE` and `NOTICE` are the files at the root of the [source 
repository](https://github.com/apache/solr-mcp) and are bundled, unchanged, 
into the thin `jar`, `-sources`, and `-javadoc` artifacts.
+
+***
+
+## Building the Files ##
+
+The binary `LICENSE` and `NOTICE` are **generated during the build** &mdash; 
they are not checked in, so they always match the exact set of dependencies 
that ship. Any normal build produces them:
+
+```bash
+./gradlew build        # full build (tests + the executable JAR)
+./gradlew bootJar      # just the executable JAR
+```
+
+To generate only the two files for inspection, without assembling the JAR:
+
+```bash
+./gradlew generateBinaryLicense generateBinaryNotice
+```
+
+They are written to:
+
+```text
+build/generated/license/LICENSE
+build/generated/license/NOTICE
+```
+
+&hellip; and bundled into `META-INF/` of the executable JAR. The build 
**fails** if a bundled dependency cannot be accounted for (see [How They Are 
Constructed](#how-they-are-constructed)), so an incomplete `LICENSE` can never 
be released by accident.
+
+***
+
+## How They Are Constructed ##
+
+Both files are assembled by a small Gradle convention plugin 
(`org.apache.solr.mcp.license-notice`, in `buildSrc/`) from two tasks.
+
+### LICENSE ###
+
+`generateBinaryLicense` writes the full Apache-2.0 license text, followed by a 
**third-party dependency appendix**. Each dependency that ships in the binary 
is listed with the license it is distributed under and a link to that license's 
text, for example:
+
+```text
+- org.apache.solr:solr-solrj:<version>
+    License: Apache-2.0 — https://spdx.org/licenses/Apache-2.0.html
+- ch.qos.logback:logback-classic:<version>
+    License: EPL-2.0 — https://spdx.org/licenses/EPL-2.0.html
+    License: GNU Lesser General Public License — 
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+```
+
+The license for each dependency is taken from the project's 
[SBOM](#role-of-the-sbom). Licenses are listed exactly as the SBOM reports 
them: the appendix is a disclosure rather than a policy, so it applies no 
allow-list and no manual corrections, and a few upstream labels may be 
imprecise (they are always permissive). The link next to each entry points to 
the authoritative license text.
+
+### NOTICE ###
+
+`generateBinaryNotice` writes the project's own `NOTICE`, followed by the 
`NOTICE` files of the bundled dependencies that ship one &mdash; copied 
**verbatim**, de-duplicated, and each attributed to the dependency it came 
from. This satisfies the Apache-2.0 requirement to carry forward the 
attribution notices of redistributed code, so the notices from bundled Apache 
projects such as SolrJ are preserved automatically. It is intentionally limited 
to **required** notices; it is not a general [...]
+
+***
+
+## Role of the SBOM ##
+
+The project also publishes a **CycloneDX Software Bill of Materials (SBOM)** 
&mdash; a machine-readable inventory of every bundled component, with versions, 
hashes, and licenses. It is generated by the `cyclonedxBom` task, embedded in 
the executable JAR at `META-INF/sbom/application.cdx.json`, and served at 
`/actuator/sbom/application` in HTTP mode.
+
+The SBOM and the `LICENSE`/`NOTICE` files play complementary roles:
+
+* The **SBOM** is the machine-readable inventory, designed for supply-chain 
and security tooling &mdash; *what is in here, at which versions, under which 
licenses?*
+* The **`LICENSE` and `NOTICE`** files are the human-readable legal artifacts 
that the Apache License and ASF release policy require.
+
+They are connected: the binary `LICENSE` appendix is **generated from the 
SBOM**, so the two never drift apart, and the appendix includes a pointer back 
to the SBOM for the full machine-readable detail. The SBOM does **not** replace 
`LICENSE`/`NOTICE` &mdash; in particular it has no concept of a `NOTICE` file, 
so the required attribution notices are aggregated directly from the 
dependencies instead.
+
+Unlike Apache Solr's main distribution, this project does **not** maintain a 
per-dependency `licenses/` folder; the SBOM plus the generated appendix cover 
the same ground with nothing to hand-maintain.
diff --git a/docs/site/content/pages/mcp/observability.md 
b/docs/site/content/pages/mcp/observability.md
new file mode 100644
index 0000000..46da40b
--- /dev/null
+++ b/docs/site/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&mdash;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&mdash;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/docs/site/content/pages/mcp/quick-start.md 
b/docs/site/content/pages/mcp/quick-start.md
new file mode 100644
index 0000000..f31f06c
--- /dev/null
+++ b/docs/site/content/pages/mcp/quick-start.md
@@ -0,0 +1,132 @@
+Title: Quick Start
+URL: mcp/quick-start.html
+save_as: mcp/quick-start.html
+template: mcp/quick-start
+
+## Prerequisites ##
+
+* Java 25+ ([Eclipse Temurin](https://adoptium.net/) recommended)
+* [Docker](https://docs.docker.com/get-docker/) and Docker Compose
+* Apache Solr **8.11–10** (the bundled sample stack runs Solr 9; the server is 
tested against 8.11, 9.4, 9.9, 9.10, and 10)
+* An MCP client &mdash; 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** &mdash; 1,100+ movie records with titles, directors, genres, and 
release dates
+* **books** &mdash; empty collection ready for indexing
+
+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:
+
+* **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": {
+    "solr-mcp": {
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest"]
+    }
+  }
+}
+```
+
+**Linux users**: add `"--add-host=host.docker.internal:host-gateway"` to the 
args array.
+
+## Native Image (experimental) ##
+
+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 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 with the native STDIO image:
+
+```json
+{
+  "mcpServers": {
+    "solr-mcp": {
+      "command": "docker",
+      "args": ["run", "-i", "--rm",
+               "-e", "SOLR_URL=http://host.docker.internal:8983/solr/";,
+               "solr-mcp:latest-native-stdio"]
+    }
+  }
+}
+```
+
+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 ##
+
+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"}]"*
+
+**Tip:** clients that support MCP completions autocomplete collection names — 
for the `{collection}` in the `solr://{collection}/schema` resource and for the 
`collection` argument of the `search-collection`, `index-data`, `view-schema`, 
and `design-schema` prompts.
+
+***
+
+## Next Steps ##
+
+* **[Adding to AI Clients](/mcp/clients/claude-desktop.html)** &mdash; 
configure Claude Code, VS Code, Cursor, JetBrains, or MCP Inspector
+* **[Features](/mcp/features.html)** &mdash; explore all available tools and 
resources
+* **[Security](/mcp/security.html)** &mdash; set up OAuth2 authentication for 
HTTP mode
+* **[Observability](/mcp/observability.html)** &mdash; enable tracing, 
metrics, and logging
diff --git a/docs/site/content/pages/mcp/resources.md 
b/docs/site/content/pages/mcp/resources.md
new file mode 100644
index 0000000..a64b238
--- /dev/null
+++ b/docs/site/content/pages/mcp/resources.md
@@ -0,0 +1,48 @@
+Title: Resources
+URL: mcp/resources.html
+save_as: mcp/resources.html
+template: mcp/resources
+
+## Guides ##
+
+* **[Quick Start](/mcp/quick-start.html)** &mdash; get from zero to a working 
AI + Solr integration in under 2 minutes
+* **[Security (OAuth2)](/mcp/security.html)** &mdash; Auth0 and Keycloak setup 
for HTTP mode
+* **[Observability](/mcp/observability.html)** &mdash; traces, metrics, and 
logs via the LGTM stack
+* **[Licensing & Notices](/mcp/licensing.html)** &mdash; where the binary 
LICENSE/NOTICE live, how they are built, and the role of the SBOM
+
+## Documentation ##
+
+* [README](https://github.com/apache/solr-mcp#readme) &mdash; quick start, 
client configurations, and usage overview
+* [CONTRIBUTING](https://github.com/apache/solr-mcp/blob/main/CONTRIBUTING.md) 
&mdash; pull request process and commit conventions
+* 
[Architecture](https://github.com/apache/solr-mcp/blob/main/dev-docs/ARCHITECTURE.md)
 &mdash; project structure and design decisions
+* [Development 
Guide](https://github.com/apache/solr-mcp/blob/main/dev-docs/DEVELOPMENT.md) 
&mdash; build system, testing, and IDE setup
+* [Auth0 
Setup](https://github.com/apache/solr-mcp/blob/main/docs/security/auth0.md) 
&mdash; detailed OAuth2 setup with Auth0
+* [Keycloak 
Setup](https://github.com/apache/solr-mcp/blob/main/docs/security/keycloak.md) 
&mdash; 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/docs/site/content/pages/mcp/security.md 
b/docs/site/content/pages/mcp/security.md
new file mode 100644
index 0000000..e9e399e
--- /dev/null
+++ b/docs/site/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 **enabled by default** 
in HTTP mode &mdash; point it at an OAuth2 issuer to use it, or disable it for 
local development.
+
+* **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**: **Secured by default** &mdash; set `OAUTH2_ISSUER_URI` to 
wire up a provider; disable for local dev only with 
`HTTP_SECURITY_ENABLED=false`
+
+### Configure Security ###
+
+HTTP mode is secured by default &mdash; you only need to point it at an OAuth2 
issuer:
+
+```bash
+export PROFILES=http
+export OAUTH2_ISSUER_URI=https://your-provider.example.com/
+./gradlew bootRun
+```
+
+Or with Docker (local image &mdash; build first with `./gradlew 
jibDockerBuild`):
+
+```bash
+docker run -p 8080:8080 --rm \
+    -e PROFILES=http \
+    -e OAUTH2_ISSUER_URI=https://your-provider.example.com/ \
+    -e SOLR_URL=http://host.docker.internal:8983/solr/ \
+    solr-mcp:latest
+```
+
+To turn authentication **off** for local development, set 
`HTTP_SECURITY_ENABLED=false`.
+
+***
+
+## 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` &mdash; MCP Inspector
+* `http://localhost:3334/oauth/callback` &mdash; `mcp-remote` (Claude Desktop, 
VS Code, Cursor, JetBrains in HTTP mode)
+* `http://localhost:8080/login/oauth2/code/auth0` &mdash; Direct server OAuth2 
code flow
+
+### 4. Run the Server ###
+
+```bash
+export PROFILES=http
+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/docs/security/auth0.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 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/docs/security/keycloak.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&mdash;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/docs/superpowers/specs/2026-06-09-license-notice-and-docs-deploy-design.md 
b/docs/superpowers/specs/2026-06-09-license-notice-and-docs-deploy-design.md
new file mode 100644
index 0000000..5d4712d
--- /dev/null
+++ b/docs/superpowers/specs/2026-06-09-license-notice-and-docs-deploy-design.md
@@ -0,0 +1,161 @@
+# Design: Binary-release LICENSE/NOTICE tooling + docs-in-code-repo deploy
+
+Date: 2026-06-09
+Author: adityamparikh (with Claude)
+Addresses:
+- apache/solr-mcp#138 review comment 
[`r3361858982`](https://github.com/apache/solr-mcp/pull/138#discussion_r3361858982)
 + follow-up `r3383830232`
+- apache/solr-site#175 comment 
[`4664039372`](https://github.com/apache/solr-site/pull/175#issuecomment-4664039372)
+
+These are two independent deliverables tracked in one spec because they were 
raised together.
+
+---
+
+## Deliverable 1 — Binary-release LICENSE/NOTICE (solr-mcp)
+
+### Problem
+
+PR #138 adds the base Apache-2.0 `LICENSE` and a minimal `NOTICE`, and bundles 
them
+into the `META-INF/` of every jar. Per
+[infra.apache.org/licensing-howto](https://infra.apache.org/licensing-howto.html):
+
+- For the **source release**, those base files are correct — the source tree 
contains
+  only ASF-authored code under Apache-2.0.
+- For a **binary release**, the artifact bundles third-party bytecode, so:
+  - `LICENSE` must additionally enumerate every bundled non-Apache dependency 
and
+    point to its license (a link, not the full license text).
+  - `NOTICE` must lift the relevant NOTICE snippets of bundled 
**Apache-licensed**
+    dependencies (notably other ASF projects such as SolrJ).
+
+The project's binary artifact is the Spring Boot fat jar (`bootJar`) — it 
embeds every
+runtime dependency. There is no tgz/`distZip`/`installDist` packaging, so 
"binary
+release" == the `bootJar`. (An SBOM was added on a separate branch; per JanHoy 
it is
+complementary, not a substitute for LICENSE/NOTICE.)
+
+### Approach — SBOM-driven, in a buildSrc convention plugin
+
+> **As shipped (PR #138).** An earlier draft generated the appendix with the
+> `com.github.jk1.dependency-license-report` plugin plus a hand-kept 
supplement for the
+> Gradle-module-metadata-only ASF artifacts (SolrJ) that the POM-only plugin 
silently
+> drops. We instead **derive the appendix from the CycloneDX SBOM** (PR #142), 
which
+> already resolves a license for every component including SolrJ — so no 
supplement is
+> needed and there is a single source of dependency data. PR #138 is therefore 
stacked
+> on #142.
+
+Implemented as the `org.apache.solr.mcp.license-notice` convention plugin under
+`buildSrc/`, with two typed tasks. The root `build.gradle.kts` only applies 
the plugin.
+
+1. **`GenerateBinaryLicense`.** Reads the CycloneDX SBOM
+   (`build/reports/application.cdx.json`, the same SBOM embedded in the 
bootJar at
+   `META-INF/sbom/application.cdx.json`), indexes each component's licenses by
+   `group:name(:version)`, and emits the binary `LICENSE` = base Apache-2.0 + 
an appendix
+   of every shipped dependency and a link to its license. "Shipped" = the 
resolved
+   `productionRuntimeClasspath` (excludes test/compile-only and 
`developmentOnly` deps).
+2. **`GenerateBinaryNotice`.** Builds the binary `NOTICE` = base NOTICE + the
+   `META-INF/NOTICE` files lifted verbatim and de-duplicated from the bundled 
jars (the
+   Maven-Shade `ApacheNoticeResourceTransformer` approach), so ASF dependency 
notices are
+   carried and stay current with no hand-maintained snippets.
+3. **`metaInf` wiring.** The `bootJar` bundles the generated LICENSE/NOTICE; 
the plain
+   `jar`, sources, and javadoc jars keep the source-form base files.
+4. **Licenses are disclosed as-reported.** The appendix is a disclosure, not a 
license
+   policy. Licenses are listed exactly as the SBOM declares them — **no 
allow-list and no
+   corrections** — so a few imprecise-but-permissive upstream labels appear 
as-is
+   (`mcp-server-security` → `Apache-1.0`; ANTLR `ST4`/`antlr-runtime` →
+   `BSD-4-Clause`/`BSD licence`); the preamble notes this and links each 
license. apache/solr
+   itself keeps no allow-list (it uses a per-dependency `solr/licenses/` 
folder, which
+   JanHoy said not to replicate), so neither do we.
+5. **Completeness gate.** The only gate: `generateBinaryLicense` runs as part 
of
+   `check`/`build` and **fails if a shipped dependency is absent from the 
SBOM**, so a
+   dependency can never be silently omitted from the LICENSE. This is JanHoy's 
"check that
+   newly added deps are accounted for"; it makes no judgement about license 
acceptability.
+6. **Tests.** The two tasks are unit-tested with `ProjectBuilder`
+   (`buildSrc/src/test/kotlin/.../LicenseNoticeTasksTest.kt`): appendix 
listing, SBOM
+   name/URL handling, the completeness gate, and NOTICE de-duplication. 
`buildSrc`'s
+   `test` runs in `./gradlew build`.
+6. **Verify.** `./gradlew build`, then
+   `unzip -p build/libs/solr-mcp-<v>.jar META-INF/LICENSE` / `... 
META-INF/NOTICE`
+   to confirm the appendix and lifted notices are present in the fat jar.
+
+### Out of scope (YAGNI)
+
+- No Solr-style per-dependency `licenses/` folder — JanHoy explicitly said the 
rigid
+  version is unnecessary.
+- No tgz packaging — the project does not ship one; "binary release" == the 
`bootJar`.
+- The source-form `LICENSE`/`NOTICE` are already correct and unchanged.
+
+### Files touched
+
+- `buildSrc/` — the `org.apache.solr.mcp.license-notice` convention plugin and 
the
+  `GenerateBinaryLicense` / `GenerateBinaryNotice` typed tasks (+ their unit 
tests).
+- `build.gradle.kts` — applies `id("org.apache.solr.mcp.license-notice")` 
(after the
+  Spring Boot + CycloneDX plugins).
+- `AGENTS.md` — "Release LICENSE / NOTICE" section.
+- Depends on PR #142 (CycloneDX SBOM) for the `cyclonedxBom` task and plugin.
+
+---
+
+## Deliverable 2 — Docs source in code repo, deployed to site (solr-mcp + 
solr-site)
+
+### Problem
+
+JanHoy wants the MCP docs to live in the **solr-mcp** repo (so every feature 
PR carries
+its documentation update) but still be **deployed to the Solr site**. The Solr 
ref guide
+does this by building the static site elsewhere and copying the output into a 
location
+mounted into the web server via `.htaccess`.
+
+### Constraint discovered
+
+solr-site is a **Pelican** site (`pelican content -o output`, published via ASF
+`.asf.yaml` — `main`/`production` protected branches, `asf-staging`). PR #175 
splits
+cleanly into two layers:
+
+- **Content** (the docs *source*): `content/pages/mcp/*.md`,
+  `content/pages/mcp/clients/*.md`, `content/doap/solr-mcp.rdf` — plain 
markdown with
+  Pelican front-matter.
+- **Presentation** (the site's rendering layer): 
`themes/solr/templates/mcp/*.html`,
+  `themes/solr/static/css/mcp.css`, `pelicanconf.py`, shared header/index 
edits.
+
+The content reuses the solr-site theme. A fully standalone build inside 
solr-mcp would
+have to vendor that theme and drift from the rest of the site.
+
+### Approach — solr-site pulls content from solr-mcp at build time
+
+Keep one themed Pelican build in solr-site; make solr-mcp the source of truth 
for the
+**content** layer only.
+
+1. **solr-mcp** owns the markdown. Move the content layer into
+   `solr-mcp/docs/site/content/` (markdown + DOAP). Feature PRs edit docs here 
alongside
+   code. A `docs/site/README.md` explains that these files are assembled into 
the Solr
+   site at build time.
+2. **solr-site** keeps the presentation layer (templates, CSS, 
`pelicanconf.py`).
+3. **Assembly at build time.** solr-site's `build.sh` (and the CI build) 
fetches the
+   `docs/site/content/` tree from solr-mcp at a **pinned ref** (a release tag, 
falling
+   back to `main`) and copies it into `content/pages/mcp/` (and the DOAP into
+   `content/doap/`) before running Pelican. Implemented as a `fetch_mcp_docs` 
step:
+   shallow `git clone --depth 1 --branch <ref>` of solr-mcp into a temp dir, 
`rsync`
+   the content into place. The pinned ref lives in one variable in `build.sh` /
+   `pelicanconf.py` so bumping the published docs version is a one-line change.
+4. **Remove** the moved markdown from solr-site so there is a single source of 
truth;
+   leave a short note in solr-site explaining where MCP content now comes from.
+
+This mirrors the ref-guide model (content built/owned elsewhere, assembled 
into the
+site) while keeping the shared theme and a single Pelican build.
+
+### Rejected alternative
+
+**solr-mcp pushes built static HTML** into a `/mcp/` subdir of solr-site's 
`production`
+branch via a release Action. Closest literal match to the `.htaccess`-mounted 
ref-guide
+output, but requires vendoring the Pelican theme in solr-mcp (drift) and a 
cross-repo
+push token. Rejected in favor of the pull model.
+
+### Files touched
+
+- **solr-mcp:** add `docs/site/content/**` (moved markdown + DOAP), 
`docs/site/README.md`.
+- **solr-site:** `build.sh` (+ CI workflow) gains a `fetch_mcp_docs` step; 
remove
+  `content/pages/mcp/**` and `content/doap/solr-mcp.rdf`; keep 
theme/templates/CSS/
+  `pelicanconf.py`; add a note documenting the source-of-truth.
+
+### Sequencing / review
+
+This spans two repos and changes how an in-review PR (#175) is structured, so 
the
+mechanism is proposed to JanHoy (reply on #175) and the cross-repo changes are 
staged on
+branches for review — nothing is pushed to the public PRs without maintainer 
sign-off.

Reply via email to