Skip to content

docs(events): point the Community over Code card at the Spring Boot 4 build - #250

Open
adityamparikh wants to merge 8 commits into
apache:mainfrom
adityamparikh:docs/coc2026-card-sb4
Open

adityamparikh wants to merge 8 commits into
apache:mainfrom
adityamparikh:docs/coc2026-card-sb4

Conversation

@adityamparikh

@adityamparikh adityamparikh commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

The Community over Code 2026 hackathon card (published at https://adityamparikh.github.io/solr-mcp/) now points at a build of the Spring Boot 4.1 / Spring AI 2.0 line (#23), which also carries everything on main: ghcr.io/adityamparikh/solr-mcp:coc2026, the native :coc2026-native-stdio / :coc2026-native-http images, and the JAR on the fork's coc2026 release. This updates the card to describe what that build does.

Changes

  • Tools: fifteen instead of twelve. The toolbox table gains list-aliases, create-alias and delete-alias, and the indexing rows describe the current inputs (JSON array, Solr's CSV handler, Solr update XML).
  • Step 3:
    • The CSV, XML and Markdown samples come from main's src/test/resources rather than a feature branch.
    • CSV and XML are passed to Solr's own handlers, which report the payload accepted rather than a document count, so the expected result says that.
    • XML is Solr update XML, so its field names match JSON; the show_ prefix warning and the step 4 and step 6 notes about it are removed, and the Option B XML paste is converted to <add><doc><field name="…">.
    • Markdown is one multi-record file indexed in one call. Its description lives in content, which the step 6 dataset note now says.
  • Step 4: fix(config): keep empty facet arrays as NamedList, not List #175 is in the image, so the ClassCastException branch is gone. An assistant that reads the schema first facets on platform_str, the copy schemaless mode makes, and gets real buckets; the note says so and gives the follow-up that shows the empty facet on platform itself.
  • Step 6: the Markdown path gets its own phrase prompt naming content, where Markdown keeps the description.
  • Native Docker images: pull commands for the prebuilt amd64 + arm64 images, ahead of the build-it-yourself commands.
  • Native http security: Spring AOT fixes the security filter chain in the binary, so HTTP_SECURITY_ENABLED only takes effect at build time. The native http build commands now set it, and a note explains that without it every tool answers Access Denied until OAuth2 is configured. The prebuilt coc2026-native-http image is built with security off.
  • Native builds panel: follows the Run via and Transport choices from step 0, like the rest of the card. JAR shows the JVM jar and the native binary, Docker shows the JVM and native images, and each shows only the stdio or http commands. The build-time security note appears only for http.
  • Nothing reachable from the conference network: security is off for the hackathon, so every server the card starts now listens on localhost only.
    • The MCP server: -p 127.0.0.1:8080:8080 for Docker, SERVER_ADDRESS=127.0.0.1 for the JAR and the native binary (shell and PowerShell, including the secured Keycloak and Auth0 walkthroughs).
    • Solr, LGTM and Keycloak are published on 127.0.0.1. Solr had no authentication and Keycloak uses admin/admin.
    • On Linux, host.docker.internal:host-gateway cannot reach a loopback-only port, so step 1 creates a solr-mcp Docker network. Solr and LGTM join it, every Docker command and client config uses --network=solr-mcp instead of --add-host, and SOLR_URL and the OTLP URLs use container names. JAR users still use localhost.
  • Observability panel:
    • Export goes over OTLP/HTTP on 4318, with one URL per signal (OTEL_TRACES_URL, OTEL_METRICS_URL, OTEL_LOGS_URL).
    • Span names are SearchService#search / CollectionService#checkHealth.
    • The request metric is http_server_requests_milliseconds_count.
    • JVM metrics arrive over OTLP; there is no /actuator/prometheus.
    • The LGTM image is pinned to 0.33.0, the version the tests use.
  • Security panel: the protected resource metadata for /mcp is read from the RFC 9728 path-suffixed URL /.well-known/oauth-protected-resource/mcp; the root URL describes the host. A token that reaches the server but fails validation is now refused with HTTP 401, so the client shows the tools as missing; the Claude Code and Codex proof steps say so.
  • Sizes and footer: 52 MB JAR, ~170 MB image, "Spring Boot 4.1.1, Spring AI 2.0.1".
  • Table cards and slides: fifteen tools; ChatGPT added to the table card's client list.

Verification

Each step was replayed against the published :coc2026 image with fresh SolrCloud containers. Results:

Area Result
All four formats, steps 3–7 Every count on the card holds (61 indexed; Netflix 20; 2020+ 31; comedies 15; Ended 33 / Ongoing 28; 2015+ rated 8+ 39; Pedro Pascal 3; top five as listed), apart from the Markdown phrase query noted above
Option B pastes Index 12 / 12 / 12 / 3 documents
Observability panel Run against grafana/otel-lgtm:0.33.0: tool spans, the correlated WARN line in Loki, and the request and JVM metrics in Prometheus all appear
Security panel Run against Keycloak 26: tokens without the /mcp audience are rejected with 401, and the card's two curl lines return Access Denied and the collection list
Table card Prints on one A5 page
Localhost binding With the published images: Solr, Grafana, OTLP and the MCP server answer on localhost and not on the LAN IP (the old -p 8080:8080 did answer there). Over the solr-mcp network the stdio and http MCP containers reach Solr by name (list-collections) and traces reach LGTM by name. The JVM jar listens on 127.0.0.1 with SERVER_ADDRESS, and the native binary honours it at run time
Codex CLI, steps 2–7 Jar, JVM image, native binary and native image over stdio; jar, JVM image and native binary over http; CSV, XML and Markdown on the jar; secured HTTP with a Keycloak bearer token. Every card result came back, with the step 4 and step 6 notes above. The native image over http hit the Codex usage limit after step 2, so it was replayed with the same tool calls directly over HTTP, with the same results

🤖 Generated with Claude Code

adityamparikh and others added 7 commits October 12, 2026 14:11
… build

The coc2026 image, native images and JAR are now built from the Spring
Boot 4.1 / Spring AI 2.0 line (apache#23), which carries
everything on main, so the card describes what that build does:

- Fifteen tools, with the three alias tools in the toolbox table.
- Step 3: CSV, XML and Markdown samples come from main's
  src/test/resources. CSV and XML go to Solr's own handlers, which
  report the payload accepted instead of a count. XML is Solr update
  XML, so its field names match JSON and the show_ prefix notes go;
  the Option B XML paste is converted to <add><doc> form. Markdown is
  one multi-record file and one tool call; its description is in
  content, which the step 6 note now says.
- Step 4: one outcome, an empty facet (apache#175 is in the image).
- Native Docker images are prebuilt for amd64 and arm64.
- Observability: OTLP/HTTP on 4318 with a URL per signal,
  ClassName#method span names, timers in milliseconds, JVM metrics over
  OTLP rather than /actuator/prometheus.
- Security: protected resource metadata for /mcp is served at the
  RFC 9728 path-suffixed URL.
- Sizes (52 MB JAR, ~170 MB image) and the verified-against footer.
- Table cards: fifteen tools, and ChatGPT in the client list.

Every step was replayed against the published image for all four
formats, including the Option B pastes, the observability panel against
grafana/otel-lgtm 0.33.0, and the security panel against Keycloak.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
… step 6

Running the card through Codex showed two places where an assistant
following it faithfully gets a different result from the one printed.

Step 4: an assistant that reads the schema first facets on platform_str,
the string copy schemaless mode makes of every text field, and gets real
buckets. The note now says so and gives the follow-up that shows the
empty facet on platform itself, which is still the lesson.

Step 6: Markdown documents keep the description in content, so "whose
description contains" finds nothing. The Markdown path now gets its own
prompt that names the content field; it returns the same two shows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
…ient

A token that reaches the server but fails validation (expired, or the
wrong aud) is now refused with HTTP 401 before the MCP session starts,
so the client shows the server's tools as missing rather than an Access
Denied result. Verified with Codex against Keycloak.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
Spring AOT fixes the security filter chain inside a native binary, so a
native http server ignores HTTP_SECURITY_ENABLED at run time and, with no
OAuth2 issuer, answers every tool call with Access Denied. The card's
native http build commands now set it for the build, and a note says
the switch only counts at build time and that the prebuilt
coc2026-native-http image is built with security off.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
The panel listed all four forms with stdio and http commands side by side.
It now follows the Run via and Transport choices from step 0, like the rest
of the page: JAR shows the JVM jar and the native binary, Docker shows the
Jib and native images, and each shows only the stdio or http commands. The
build-time security note appears only for http.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
The http commands published port 8080 on all interfaces, and the JAR and
native binary listen on all interfaces by default. With security switched
off for the hackathon, anyone on the same conference Wi-Fi could reach a
participant's MCP server and, through it, their Solr. The page already
said the insecure setup was "bound to localhost"; now the commands do it.

Docker publishes on 127.0.0.1 (-p 127.0.0.1:8080:8080). The JAR and the
native binary set SERVER_ADDRESS=127.0.0.1, in both shell and PowerShell
forms, including the secured Keycloak and Auth0 walkthroughs. Clients,
the ngrok tunnel and mcp-remote all connect via localhost, so nothing
else changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
Solr was published on every interface with no authentication, so anyone
on the same Wi-Fi could read or delete a participant's collections. LGTM
(Grafana, OTLP) and the Keycloak walkthrough, which uses admin/admin, had
the same exposure.

Each is now published on 127.0.0.1 only. The MCP server's container used
to reach Solr and LGTM through the host (host.docker.internal), which a
loopback-only port breaks on Linux. Step 1 therefore creates a solr-mcp
Docker network: Solr and LGTM join it, every Docker command and client
config replaces --add-host with --network=solr-mcp, and SOLR_URL and the
OTLP URLs use container names. JAR users still use localhost unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
- ChatGPT: add the server through "Add custom MCP server" and create it
  as a plugin; the developer-mode app flow is gone.
- MCP Inspector 2.x takes one argument per line in the Arguments field;
  a single pasted line reaches docker as one argument and fails with
  "unknown shorthand flag". Its Environment field configures the docker
  client, not the container.
- JetBrains AI Assistant: configure through Settings | Tools | AI
  Assistant | Model Context Protocol (MCP); .junie/mcp/mcp.json is
  Junie's file.
- Claude Desktop is now an official beta on Ubuntu and Debian.
- Zed schema re-verified on 1.23.2.
- LGTM: publish only the OTLP/HTTP port the server exports to.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Aditya Parikh <aditya.m.parikh@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant