Skip to main content

Elasticsearch MCP server — query logs with or without SSH tunnel

Project description

Elasticsearch MCP Server

Query Elasticsearch logs directly from Claude Cowork — with or without an SSH tunnel.


Installation

1. Install the plugin

Get es-mcp from the Cowork plugin marketplace and install it.

2. Install uv

The MCP server runs via uvx, which requires uv to be installed on your machine:

# Windows
powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

3. Add the MCP entry to claude_desktop_config.json

Open the file at:

Windows:  %APPDATA%\Claude\claude_desktop_config.json
macOS:    ~/Library/Application Support/Claude/claude_desktop_config.json

Add this minimal entry inside "mcpServers": { }:

{
  "mcpServers": {
    "elasticsearch-logs": {
      "command": "uvx",
      "args": ["artisan-es-reader-plugin@latest", "artisan-es-reader-plugin"]
    }
  }
}

That's it — no env vars needed.

4. Configure your profiles by asking Claude

Restart Cowork, then just ask Claude to add your Elasticsearch connections:

"Add a tealive_production profile — bastion is 43.216.208.205, pem is at ~/keys/prod.pem"

Claude will call configure_profile and save your settings to ~/.es-mcp/profiles.json automatically. You can add as many profiles as you like this way.

5. Restart Cowork

The SSH tunnel starts automatically on first tool use.


How profiles are stored

Profiles are saved to ~/.es-mcp/profiles.json — a plain, human-readable JSON file you can also edit directly if you prefer:

{
  "default": "tealive_production",
  "profiles": {
    "tealive_production": {
      "es_use_ssl": true,
      "es_verify_certs": false,
      "es_username": "your-username",
      "es_password": "your-password",
      "ssh_host": "43.216.208.205",
      "ssh_username": "ubuntu",
      "ssh_pem_file": "~/keys/prod.pem"
    },
    "baskbear": {
      "es_use_ssl": true,
      "es_verify_certs": false,
      "ssh_host": "baskbear-bastion-ip",
      "ssh_username": "ubuntu",
      "ssh_pem_file": "~/keys/baskbear.pem"
    }
  }
}

Config priority order

The server looks for profiles in this order — the first match wins:

  1. ES_PROFILES env var (JSON string) — backward compat for existing users
  2. ES_PROFILES_FILE env var — path to a custom JSON file
  3. ~/.es-mcp/profiles.json — auto-discovered (written by configure_profile)
  4. Legacy flat ES_* / SSH_* env vars — single profile named "default"

Selecting a profile

Every tool accepts an optional profile argument. Just ask naturally:

"Search baskbear logs for payment errors" "Show recent errors in tealive production"

Omit it and the default profile is used. Call list_profiles to see what's configured, or connection_info to inspect a specific one.


Per-profile settings reference

Key Description Default
es_host / es_port ES host/port for direct connections (ignored when ssh_host is set) localhost / 9200
es_username / es_password Elasticsearch credentials empty
es_use_ssl true if ES runs HTTPS false
es_verify_certs false for self-signed certs false
ssh_host Bastion / jump host IP or hostname. Leave unset for a direct connection empty
ssh_port / ssh_username SSH port / user 22 / ubuntu
ssh_pem_file Path to the PEM key on this machine (e.g. ~/keys/prod.pem) ~/.ssh/id_rsa
ssh_remote_es_host / ssh_remote_es_port ES host/port as seen from the bastion localhost / 9200
ssh_local_port Local tunnel port (0 = auto) 0
ssh_keepalive Seconds between SSH keepalive packets so idle tunnels aren't dropped (0 disables) 30

Tunnel resilience

SSH tunnels are kept alive with periodic keepalive packets (ssh_keepalive, 30s by default) so the server's idle timeout doesn't drop them. If a tunnel is dropped anyway, it is detected and automatically rebuilt on the next query — no need to restart Claude.


Available tools

All tools accept an optional profile argument to choose the Elasticsearch source.

Tool What it does
configure_profile Add or update a profile — saves to ~/.es-mcp/profiles.json
delete_profile Remove a profile
list_profiles List configured profiles and the default
list_indices List indices (supports glob pattern)
search_logs Full-text search with filters, sort, pagination
get_recent_errors Error-level entries from the last N minutes
get_index_mapping Field schema for an index
run_aggregation Run a custom ES aggregation
connection_info Show active connection / tunnel status

Updating

For users

Updates are automatic — just restart Cowork and uvx will pull the latest version from PyPI.

For maintainers

  1. Make changes to src/es_mcp/server.py
  2. Bump the version in pyproject.toml
  3. Build and publish:
    python -m build
    twine upload dist/*
    
  4. Users get the new version automatically on next Cowork restart — no action needed on their end

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

artisan_es_reader_plugin-0.5.0.tar.gz (39.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

artisan_es_reader_plugin-0.5.0-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file artisan_es_reader_plugin-0.5.0.tar.gz.

File metadata

  • Download URL: artisan_es_reader_plugin-0.5.0.tar.gz
  • Upload date:
  • Size: 39.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for artisan_es_reader_plugin-0.5.0.tar.gz
Algorithm Hash digest
SHA256 e65cf78476ec70e31f4b2ee903c3114b1de7711102f88aaaf6a5854bf813969a
MD5 e190df89cd3069373d566bbdf501d07d
BLAKE2b-256 6394cd94d007cd9f0bea9c653a20fd7b5939f076384a6f8238638c77e5083715

See more details on using hashes here.

File details

Details for the file artisan_es_reader_plugin-0.5.0-py3-none-any.whl.

File metadata

File hashes

Hashes for artisan_es_reader_plugin-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e4a8a3726be81f1344144d36fb9ca0c1ffbc2fe9c92331a51c4c0208699097a5
MD5 50e42ed934f3215cf9fcf3cba003e125
BLAKE2b-256 323bd5e20f1e664bcf1659b857b2ab8ba8d39e35bf030a1eebf2c8e9727b22df

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page