From c5393f9b5e9d1e02f76bb7024cb56f28006707fb Mon Sep 17 00:00:00 2001 From: Charles N Wyble Date: Fri, 23 Jan 2026 00:40:09 -0500 Subject: [PATCH] feat: add elasticsearch-mcp validation Build and validate Elasticsearch MCP server for search/indexing. Changes: - docker-compose.yml: Updated elasticsearch-mcp to use custom Dockerfile and ES_URL env var (not ELASTICSEARCH_URL) - dockerfiles/elasticsearch-mcp/Dockerfile: Added custom Dockerfile with fix to pass "stdio" subcommand to ENTRYPOINT - STATUS.md: Added elasticsearch-mcp as validated MCP (v0.2.1, 22MB) Validation: - Container builds successfully from Rust source (22MB) - Fixed Dockerfile to pass "stdio" subcommand to entry point - MCP protocol handshake verified with initialize request - Protocol version 2024-11-05 confirmed - Server name: rmcp, version 0.2.1 - Requires ES_URL environment variable (not ELASTICSEARCH_URL) - NOTE: Server is deprecated, superseded by Elastic Agent Builder - Tested with proper --name flag for container --- STATUS.md | 2 ++ docker-compose.yml | 4 ++-- dockerfiles/elasticsearch-mcp/Dockerfile | 28 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 dockerfiles/elasticsearch-mcp/Dockerfile diff --git a/STATUS.md b/STATUS.md index 6afe0de..fac68b3 100644 --- a/STATUS.md +++ b/STATUS.md @@ -30,6 +30,7 @@ Last validated: 2026-01-22 - cloudron-mcp: Built (v0.1.0) - stdio-based, requires CLOUDRON_URL - docker-mcp: Built (v0.1.0) - stdio-based, Python-based, requires Docker socket - drawio-mcp: Built (v1.4.0) - stdio-based, TypeScript/pnpm, requires DRAWIO_URL +- elasticsearch-mcp: Built (v0.2.1) - stdio-based, Rust-based, requires ES_URL - bash-language-server: Built (v5.6.0) - configured in crush.json via wrapper script - docker-language-server: Built (v0.0.0) - configured in crush.json via wrapper script - marksman: Built (2025-12-13) - configured in crush.json via wrapper script @@ -55,6 +56,7 @@ Last validated: 2026-01-22 | cloudron-mcp | Built | Container built from source (374MB). Fixed Dockerfile CMD to use dist/server.js. MCP stdio-based, requires CLOUDRON_URL env var. Version 0.1.0. | | docker-mcp | Built | Container built from Python source (188MB). Uses uv package manager. MCP stdio-based, requires Docker socket mount (/var/run/docker.sock). Version 0.1.0. | | drawio-mcp | Built | Container built from TypeScript source (302MB). Uses pnpm package manager. MCP stdio-based, requires DRAWIO_URL env var. Version 1.4.0. | +| elasticsearch-mcp | Built | Container built from Rust source (22MB). Fixed Dockerfile to pass "stdio" subcommand. MCP stdio-based, requires ES_URL env var. NOTE: Server is deprecated. Version 0.2.1. | | bash-language-server | Built | Container built using prebuilt npm package (190MB). LSP configured in crush.json via wrapper script. Version 5.6.0. | | docker-language-server | Built | Container built from Go source (49.2MB). LSP configured in crush.json via wrapper script. Version 0.0.0. | | marksman | Built | Container built from prebuilt binary (144MB). LSP configured in crush.json via wrapper script. Version 2025-12-13. | diff --git a/docker-compose.yml b/docker-compose.yml index 6cf7394..7ee8d6e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -385,11 +385,11 @@ services: image: kneldevstack-aimiddleware-elasticsearch-mcp build: context: ./vendor/mcp-server-elasticsearch - dockerfile: Dockerfile + dockerfile: ../../dockerfiles/elasticsearch-mcp/Dockerfile container_name: kneldevstack-aimiddleware-elasticsearch-mcp restart: unless-stopped environment: - - ELASTICSEARCH_URL=${ELASTICSEARCH_URL:-http://localhost:9200} + - ES_URL=${ES_URL:-http://localhost:9200} - ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME} - ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD} ports: diff --git a/dockerfiles/elasticsearch-mcp/Dockerfile b/dockerfiles/elasticsearch-mcp/Dockerfile new file mode 100644 index 0000000..3a4cd77 --- /dev/null +++ b/dockerfiles/elasticsearch-mcp/Dockerfile @@ -0,0 +1,28 @@ +# Copyright Elasticsearch B.V. and contributors +# SPDX-License-Identifier: Apache-2.0 + +FROM rust:1.89@sha256:c50cd6e20c46b0b36730b5eb27289744e4bb8f32abc90d8c64ca09decf4f55ba AS builder + +WORKDIR /app + +COPY Cargo.toml Cargo.lock ./ + +# Cache dependencies +RUN mkdir -p ./src/bin && \ + echo "pub fn main() {}" > ./src/bin/elasticsearch-core-mcp-server.rs && \ + cargo build --release + +COPY src ./src/ + +RUN cargo build --release + +#-------------------------------------------------------------------------------------------------- + +FROM cgr.dev/chainguard/wolfi-base:latest + +COPY --from=builder /app/target/release/elasticsearch-core-mcp-server /usr/local/bin/elasticsearch-core-mcp-server + +ENV CONTAINER_MODE=true + +EXPOSE 8080/tcp +ENTRYPOINT ["/usr/local/bin/elasticsearch-core-mcp-server", "stdio"]