Render MCP Server
OFFICIAL SERVERCreate, deploy and troubleshoot Render services, Postgres and Key Value from an AI client
Search, inspect and manage Elasticsearch or OpenSearch clusters from an MCP client
By Se7en (individual) Python Local · stdio DatabasesDevOps and monitoring
61 popularity score ★ 316 ↓ 10k/mo
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs ELASTICSEARCH_HOSTS, ELASTICSEARCH_USERNAME, ELASTICSEARCH_PASSWORD. Replace each <NAME> with your value.
claude mcp add elasticsearch -e ELASTICSEARCH_HOSTS=<ELASTICSEARCH_HOSTS> -e ELASTICSEARCH_USERNAME=<ELASTICSEARCH_USERNAME> -e ELASTICSEARCH_PASSWORD=<ELASTICSEARCH_PASSWORD> -- uvx elasticsearch-mcp-server{
"mcpServers": {
"elasticsearch": {
"command": "uvx",
"args": [
"elasticsearch-mcp-server"
],
"env": {
"ELASTICSEARCH_HOSTS": "<ELASTICSEARCH_HOSTS>",
"ELASTICSEARCH_USERNAME": "<ELASTICSEARCH_USERNAME>",
"ELASTICSEARCH_PASSWORD": "<ELASTICSEARCH_PASSWORD>"
}
}
}
}{
"mcpServers": {
"elasticsearch": {
"command": "uvx",
"args": [
"elasticsearch-mcp-server"
],
"env": {
"ELASTICSEARCH_HOSTS": "<ELASTICSEARCH_HOSTS>",
"ELASTICSEARCH_USERNAME": "<ELASTICSEARCH_USERNAME>",
"ELASTICSEARCH_PASSWORD": "<ELASTICSEARCH_PASSWORD>"
}
}
}
}{
"servers": {
"elasticsearch": {
"type": "stdio",
"command": "uvx",
"args": [
"elasticsearch-mcp-server"
],
"env": {
"ELASTICSEARCH_HOSTS": "<ELASTICSEARCH_HOSTS>",
"ELASTICSEARCH_USERNAME": "<ELASTICSEARCH_USERNAME>",
"ELASTICSEARCH_PASSWORD": "<ELASTICSEARCH_PASSWORD>"
}
}
}
}[mcp_servers.elasticsearch]
command = "uvx"
args = ["elasticsearch-mcp-server"]
[mcp_servers.elasticsearch.env]
ELASTICSEARCH_HOSTS = "<ELASTICSEARCH_HOSTS>"
ELASTICSEARCH_USERNAME = "<ELASTICSEARCH_USERNAME>"
ELASTICSEARCH_PASSWORD = "<ELASTICSEARCH_PASSWORD>"gemini mcp add --scope user -e ELASTICSEARCH_HOSTS=<ELASTICSEARCH_HOSTS> -e ELASTICSEARCH_USERNAME=<ELASTICSEARCH_USERNAME> -e ELASTICSEARCH_PASSWORD=<ELASTICSEARCH_PASSWORD> elasticsearch uvx -- elasticsearch-mcp-serverOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs ELASTICSEARCH_HOSTS, ELASTICSEARCH_USERNAME, ELASTICSEARCH_PASSWORD. Replace each <NAME> with your value.
git clone https://github.com/cr7258/elasticsearch-mcp-server.gitclaude mcp add elasticsearch -e ELASTICSEARCH_HOSTS=<ELASTICSEARCH_HOSTS> -e ELASTICSEARCH_USERNAME=<ELASTICSEARCH_USERNAME> -e ELASTICSEARCH_PASSWORD=<ELASTICSEARCH_PASSWORD> -- uv --directory '<ABSOLUTE_PATH_TO_CLONE>' run elasticsearch-mcp-server{
"mcpServers": {
"elasticsearch": {
"command": "uv",
"args": [
"--directory",
"<ABSOLUTE_PATH_TO_CLONE>",
"run",
"elasticsearch-mcp-server"
],
"env": {
"ELASTICSEARCH_HOSTS": "<ELASTICSEARCH_HOSTS>",
"ELASTICSEARCH_USERNAME": "<ELASTICSEARCH_USERNAME>",
"ELASTICSEARCH_PASSWORD": "<ELASTICSEARCH_PASSWORD>"
}
}
}
}{
"mcpServers": {
"elasticsearch": {
"command": "uv",
"args": [
"--directory",
"<ABSOLUTE_PATH_TO_CLONE>",
"run",
"elasticsearch-mcp-server"
],
"env": {
"ELASTICSEARCH_HOSTS": "<ELASTICSEARCH_HOSTS>",
"ELASTICSEARCH_USERNAME": "<ELASTICSEARCH_USERNAME>",
"ELASTICSEARCH_PASSWORD": "<ELASTICSEARCH_PASSWORD>"
}
}
}
}{
"servers": {
"elasticsearch": {
"type": "stdio",
"command": "uv",
"args": [
"--directory",
"<ABSOLUTE_PATH_TO_CLONE>",
"run",
"elasticsearch-mcp-server"
],
"env": {
"ELASTICSEARCH_HOSTS": "<ELASTICSEARCH_HOSTS>",
"ELASTICSEARCH_USERNAME": "<ELASTICSEARCH_USERNAME>",
"ELASTICSEARCH_PASSWORD": "<ELASTICSEARCH_PASSWORD>"
}
}
}
}[mcp_servers.elasticsearch]
command = "uv"
args = ["--directory", "<ABSOLUTE_PATH_TO_CLONE>", "run", "elasticsearch-mcp-server"]
[mcp_servers.elasticsearch.env]
ELASTICSEARCH_HOSTS = "<ELASTICSEARCH_HOSTS>"
ELASTICSEARCH_USERNAME = "<ELASTICSEARCH_USERNAME>"
ELASTICSEARCH_PASSWORD = "<ELASTICSEARCH_PASSWORD>"gemini mcp add --scope user -e ELASTICSEARCH_HOSTS=<ELASTICSEARCH_HOSTS> -e ELASTICSEARCH_USERNAME=<ELASTICSEARCH_USERNAME> -e ELASTICSEARCH_PASSWORD=<ELASTICSEARCH_PASSWORD> elasticsearch uv -- --directory '<ABSOLUTE_PATH_TO_CLONE>' run elasticsearch-mcp-serverELASTICSEARCH_HOSTS |
Required: Comma-separated cluster addresses. |
|---|---|
ELASTICSEARCH_API_KEY secret |
Optional: Elasticsearch or Elastic Cloud API key, in place of username and password. |
OPENSEARCH_HOSTS |
Optional: Cluster addresses for the opensearch-mcp-server program, used with OPENSEARCH_USERNAME and OPENSEARCH_PASSWORD. |
ELASTICSEARCH_CLUSTERS_FILE |
Optional: Path to a JSON file of named clusters. ELASTICSEARCH_CLUSTERS takes the same JSON inline, and the file wins when both are set. |
DEFAULT_CLUSTER |
Optional: Named cluster used when a tool call gives none, the first one when unset. |
ELASTICSEARCH_PROXY |
Optional: Proxy for all cluster requests: an http, https, socks5 or socks5h URL. OPENSEARCH_PROXY does the same for OpenSearch, and a cluster's own proxy key overrides it. |
VERIFY_CERTS |
Optional: Set to true to check TLS certificates. |
DISABLE_HIGH_RISK_OPERATIONS |
Optional: Set to true to hide the write tools. |
DISABLE_OPERATIONS |
Optional: Comma-separated tools to hide in place of the default list. Read only when DISABLE_HIGH_RISK_OPERATIONS=true. |
MCP_API_KEY secret |
Optional: Bearer token the SSE or streamable HTTP endpoint asks for. |
| Set together: basic auth | |
ELASTICSEARCH_USERNAME |
Required: Basic-auth user, or set ELASTICSEARCH_API_KEY instead. |
ELASTICSEARCH_PASSWORD secret |
Required: Basic-auth password for ELASTICSEARCH_USERNAME. |
This server connects an MCP client to one or more Elasticsearch or OpenSearch clusters through 20 tools. The read side lists and inspects indices, data streams and aliases, runs searches, fetches documents by ID, reports cluster health and statistics, and shows how an analyzer tokenizes a piece of text. Other tools create and delete indices, documents, data streams and aliases. There is also general_api_request, which sends any HTTP request to the cluster's REST API. In practice that means it can do whatever the cluster credentials allow.
The PyPI package installs two programs: elasticsearch-mcp-server (Elasticsearch 8.x client) and opensearch-mcp-server (OpenSearch 1.x to 3.x). For Elasticsearch 7.x or 9.x you install elasticsearch-mcp-server-es7 or elasticsearch-mcp-server-es9 instead. It speaks stdio by default. With --transport sse or streamable-http it listens on 127.0.0.1:8000 unless you pass --host or --port. You can define several named clusters, and then every tool takes an optional cluster argument. Set RESPONSE_FORMAT=gcf if you want results handed to the model in a compact format rather than JSON.
Traffic can go through an HTTP, HTTPS or SOCKS5 proxy via ELASTICSEARCH_PROXY or OPENSEARCH_PROXY, or a proxy key per cluster. SOCKS support ships with the package (pyproject.toml), so nothing extra needs installing. The code pins that proxy over any HTTP_PROXY, HTTPS_PROXY or NO_PROXY in the environment (src/clients/proxy.py).
Two more things the README does not spell out. DISABLE_OPERATIONS is only read when DISABLE_HIGH_RISK_OPERATIONS=true, and its list replaces the default set of write tools. A write tool you leave off it stays available (src/risk_config.py). In HTTP mode the server also answers /healthz and /readyz for Kubernetes probes, and /readyz returns 503 if the cluster ping fails or takes longer than 5 seconds (src/server.py).
| Runtime | Python 3.10+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Elasticsearch or OpenSearch | Your own instanceA reachable cluster plus a username and password or an Elasticsearch API key. Elastic Cloud API keys work too |
| Also |
|
Pick the package that matches the cluster: elasticsearch-mcp-server for Elasticsearch 8.x, elasticsearch-mcp-server-es7 or elasticsearch-mcp-server-es9 for 7.x or 9.x, or the opensearch-mcp-server program from this package for OpenSearch 1.x to 3.x.
Each package is built against one Elasticsearch client major version (this one pins elasticsearch 8.17.2), so 7.x and 9.x clusters need the separate -es7 or -es9 package. API-key sign-in works for Elasticsearch only; OpenSearch takes a username and password. TLS certificates are not checked unless VERIFY_CERTS=true. REQUEST_TIMEOUT has no default of its own, so the client library's timeout applies. In HTTP mode, MCP_API_KEY is not required, and without it the endpoint accepts anyone who can reach it.
Suits developers and operators who run their own Elasticsearch or OpenSearch clusters and want to query, inspect or tidy indices from a chat client, including across several named clusters. Because general_api_request and the delete tools can change or remove data, set DISABLE_HIGH_RISK_OPERATIONS=true and use a read-only API key when pointing it at production. It is a community project, not from Elastic. Elastic publishes its own server, elastic/mcp-server-elasticsearch, which we also list; choose that one if you want a vendor-maintained server.
10 only read, 4 change things, 6 can delete or overwrite. A ? marks an optional parameter.
general_api_request deletesmethod: stringpath: stringparams?: objectbody?: objectcluster?: stringlist_indicescluster?: stringget_indexindex: stringcluster?: stringcreate_index changesindex: stringbody?: objectcluster?: stringdelete_index deletesindex: stringcluster?: stringcreate_data_stream changesname: stringcluster?: stringget_data_streamname?: stringcluster?: stringdelete_data_stream deletesname: stringcluster?: stringsearch_documentsindex: stringbody: objectcluster?: stringindex_document deletesindex: stringdocument: objectid?: stringcluster?: stringget_documentindex: stringid: stringcluster?: stringdelete_document deletesindex: stringid: stringcluster?: stringdelete_by_query deletesindex: stringbody: objectcluster?: stringget_cluster_healthcluster?: stringget_cluster_statscluster?: stringlist_aliasescluster?: stringget_aliasindex: stringcluster?: stringput_alias changesindex: stringname: stringbody: objectcluster?: stringdelete_alias changesindex: stringname: stringcluster?: stringanalyze_texttext: stringindex?: stringanalyzer?: stringtokenizer?: stringfilter?: arraychar_filter?: arrayexplain?: booleanattributes?: arraycluster?: string