mcp-opensearch
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OPENSEARCH_URL | No | Direct OpenSearch URL, used as fallback (e.g. https://os.example.com:9200) | |
| OPENSEARCH_TIMEOUT | No | Request timeout in seconds | 60 |
| OPENSEARCH_PASSWORD | Yes | Basic auth password | |
| OPENSEARCH_USERNAME | Yes | Basic auth username | |
| OPENSEARCH_VERIFY_SSL | No | Set 'false' for self-signed certificates | true |
| OPENSEARCH_DASHBOARDS_URL | No | Dashboards URL, tried first (e.g. https://opensearch.example.com) | |
| OPENSEARCH_MAX_SEARCH_LIMIT | No | Hard cap on search limit parameter | 200 |
| OPENSEARCH_MAX_HISTOGRAM_BUCKETS | No | Reject histogram requests exceeding this estimated bucket count | 2000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| opensearch_testA | Call first in every session to confirm connectivity and see the active backend. Check the |
| opensearch_cluster_healthA | Requires cluster:monitor/health privilege — if you get 403, use opensearch_test instead. Returns cluster status (green/yellow/red), node count, active shards, and unassigned shards. Useful to confirm the backend is not degraded before trusting query results. |
| opensearch_list_indicesA | If you get 403, use opensearch_list_index_patterns instead (lower privilege requirement). Returns all indices sorted by name with doc count, store size, and health. Use this to find the exact index name before querying — date-sharded indices follow a pattern like wazuh-alerts-4.x-2026.06.24. |
| opensearch_list_index_patternsA | Dashboards-only alternative to opensearch_list_indices when _cat/indices access is blocked. Returns id, title, and time field name for each index pattern as configured in the OpenSearch Dashboards UI. Requires the Dashboards backend to be active. |
| opensearch_get_mappingA | Use to see all field names and types; if you get 403 use opensearch_discover_fields instead. opensearch_discover_fields only requires search privilege (not indices:admin/mappings/get) but only returns fields present in sampled documents. Returns nested fields flattened to dot-notation, e.g. "rule.level": "integer". |
| opensearch_discover_fieldsA | Fallback for opensearch_get_mapping when the mapping API is blocked; samples live documents. Only returns fields that actually appear in the sampled documents — fields absent from the sample won't be listed. Unlike opensearch_get_mapping, only requires search privilege. Increase sample_size for broader field coverage (max 100). |
| opensearch_searchA | Full-document retrieval using Lucene syntax (same as the Dashboards search bar). Always pass source_fields to limit response size — 50 full docs ≈ 237 KB and will fill context quickly. Omitting from_ts/to_ts scans the full index history, which is slow and expensive; adding a time range reduces query time by up to 15×. |
| opensearch_countA | Fastest way to check how many documents match a condition; never returns content. Prefer over opensearch_search when you only need the count — it never fills context with document data. Without from_ts/to_ts, scans the full index (4–5 s on 50 M docs). |
| opensearch_termsA | Frequency table for a keyword field — top N values with their document counts. If results look wrong or you see a heap warning, append .keyword to the field name (e.g. agent.name.keyword). Never use on analyzed text fields like rule.description — aggregations on text fields load fielddata into cluster heap. |
| opensearch_multi_termsA | Preferred over calling opensearch_terms in a loop — single round-trip for multiple fields. Inherits the .keyword guidance from opensearch_terms: append .keyword to any text-like field name to avoid fielddata heap pressure. |
| opensearch_histogramA | Event count over time; always specify from_ts and to_ts (meaningless without a range). Use interval="auto" when unsure — it picks ~50 buckets and is always safe. Fine intervals over long ranges (e.g. "1m" over a week) are rejected before the query runs to protect cluster resources. |
| opensearch_statsA | Min/max/avg/std for a numeric field. Only works on numeric types (integer, float, long). Passing a text field returns a 400 error with a clear message. Use opensearch_terms if you want frequency counts for a keyword field instead. |
| opensearch_pplA | Execute a PPL (Piped Processing Language) query against OpenSearch. Prefer over opensearch_search when you need multi-step pipeline operations (filter → stats → sort) in a single query. Not interchangeable with Lucene — different syntax. Returns 404 if the PPL plugin is not installed. PPL syntax: source= | [| ...] Common commands: where — filter rows stats count() by — aggregate fields , — select columns sort - — order results (- = descending) head — limit rows |
| opensearch_apiA | Escape hatch for any read GET endpoint not covered by other tools. Use when you know the OpenSearch REST path but no dedicated tool exists. For search/count/terms/histogram use the dedicated tools — they add safety guards and better error messages. Only GET is supported; write/admin paths (_delete, _bulk, _update, _reindex, etc.) are blocked. |
| opensearch_explainA | Explain why a specific document matches (or doesn't match) a query. Use after opensearch_search returns unexpected results and you have a known document ID. Get the doc ID from a prior search by including "_id" in source_fields (note: _id is a metadata field — use opensearch_search and read the _id from hits). Exact index name only — no wildcards. |
| opensearch_index_settingsA | Get index settings: shard count, replicas, refresh interval, and ILM policy name. Use to understand why an index behaves unexpectedly — e.g. slow writes from a short refresh interval, data loss risk from zero replicas, or unexpected retention from an ILM policy. Prefer opensearch_get_mapping for field schema exploration. |
| opensearch_compareA | Compare the top values of a field between two time windows. Prefer over calling opensearch_terms twice manually — computes the diff and percent change automatically. Use to detect new patterns, increased/decreased activity, or disappeared sources between a baseline and a selection period. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| investigate_alert | Step-by-step investigation guide for a specific agent's alerts in a time window. |
| top_offenders | Guide to find the top agents, rules, and source IPs in a time window. |
| compare_time_windows | Guide to compare alert patterns between two time periods. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bunnyiesart/mcp-opensearch'
If you have feedback or need assistance with the MCP directory API, please join our Discord server