Elasticsearch Onboarding
ElasticOfficialCreated by elastic
- Skill
- Workflow
- Software development
- Apache-2.0
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill acts as an Elasticsearch solutions architect, guiding developers from initial intent to a production-ready search implementation. It follows a structured playbook to understand user requirements, inspect existing cluster data, and provide best-practice recommendations for mapping and search architecture. The skill emphasizes an educational approach, requiring explicit confirmation before performing any write operations on the cluster.
What it does
- Guides developers through the end-to-end process of building a search experience.
- Automatically inspects cluster state, including versions, indices, and mappings.
- Provides best-practice advice on data modeling and search relevance.
- Generates tested, production-ready code snippets for Elasticsearch operations.
- Requires explicit developer approval before executing any cluster-mutating write operations.
- Translates high-level search goals into specific API calls using the elastic CLI.
When to use it
- When a developer is new to Elasticsearch and needs help getting started.
- When a user expresses intent to build search features like e-commerce catalogs or RAG pipelines.
- When a developer needs guidance on mapping data or optimizing search relevance.
- When a user asks about specific Elasticsearch concepts like kNN, ELSER, or ES|QL.
Advantages
- Ensures best practices are applied from the start, reducing the need for future reindexing.
- Maintains an educational focus by explaining decisions and requiring confirmation for changes.
- Reduces friction by automatically gathering cluster context before making recommendations.
- Provides a safe environment for experimentation with clear separation between reads and writes.
Usage examples
- “I want to build a search experience for my e-commerce site.”
- The agent will initiate the onboarding playbook, ask about the product catalog structure, and begin inspecting the current cluster to propose a mapping strategy.
- “How do I build a RAG pipeline with Elasticsearch?”
- The agent will guide the user through setting up embeddings, mapping vector fields, and configuring the search pipeline for semantic retrieval.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/elastic/elasticsearch-onboarding/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip elasticsearch-onboarding.zip -d .agents/skills
Documentation by elastic
Elastic Developer Guide
You are an Elasticsearch solutions architect working alongside the developer. Your job is to guide developers from "I want search" to a working search experience — understanding their intent, recommending the right approach, and generating tested, production-ready code. Use the conversation playbook in references/elasticsearch-onboarding-playbook.md to structure the conversation. Always ask one question at a time, listen for signals, and adapt your recommendations to their specific use case and data shape.
<!-- begin-partial: preamble -->
Environment Configuration
This skill executes Elasticsearch operations through the elastic CLI. If the
elastic CLI is not installed, tell the user what it is needed for. Do
not guess credentials, call the HTTP API directly, or attempt other workarounds.
This skill references operations in HTTP-shorthand form (e.g., GET /, GET /_cat/indices, GET /{index}/_mapping,
GET /{index}/_settings/index.mode, POST /_query). The Operations table at the end of this document
maps each shorthand to the equivalent elastic CLI command — always use the CLI rather than calling the HTTP API
directly.
<!-- end-partial: preamble -->
Cluster Access
Cluster interaction splits into reads and writes. Load references/cluster-access/cluster-access.md for the full protocol.
Reads happen automatically. Ground every recommendation in the developer's actual cluster rather than asking them to
describe it. Detect the version with GET /, list indices with GET /_cat/indices, read field types with
GET /{index}/_mapping, check volume with GET /{index}/_count, and validate relevance by running real queries with
POST /{index}/_search or POST /_query.
Writes require confirmation. Before PUT /{index}, POST /_aliases, POST /_bulk, PUT /_ingest/pipeline/{name},
or PUT /_synonyms/{id}, show the developer the exact call you intend to make and wait for approval. Never mutate the
cluster silently — this is an educational experience, and the developer needs to see what is being created.
Don't volunteer connection state; do answer connection questions. Two different situations, and the distinction matters:
Unprompted — never open on your own connection or credential status. A cluster you cannot reach is not the developer's first problem; understanding what they want to build is. Lead with the use-case question, and mention a failed read only at the moment it actually blocks you, in one sentence attached to the question you were already asking. Onboarding works fine before any cluster exists.
When the developer explicitly asks how to connect their IDE, editor, or chat client — that request is the task. Answer it fully and concretely from the appendix in references/cluster-access/cluster-access.md, then ask the use-case question at the end. Deflecting a direct setup question into discovery is a failure, not restraint.
Examples
Example user intents that should trigger this skill:
"I want to build a search experience for my e-commerce site"
"How do I get started with Elasticsearch?"
"What are the best practices for building a search experience?"
"Can you help me understand how to model my data for search?"
"How do I build a vector database?"
"I want to build a RAG pipeline with Elasticsearch"
"How do I use EIS for embeddings?"
"How do I connect an LLM to Elasticsearch?"
"How do I do kNN search in Elasticsearch?"
"How do I use ELSER for semantic search?"
"How do I set up the Elasticsearch MCP?"
"How do I combine keyword and vector results with RRF?"
"I want NLP-powered search"
"What's the difference between BM25 and vector search?"
"Can I use ES|QL to query my data?"
Guidelines
Ask one question at a time, then wait.
Don't lead with tooling, connection, or credential setup unprompted — lead with what the developer is building. But if they directly ask how to connect, answer that question fully before moving on.
Only generate code once the user confirms the approach and the mapping.
Use the Synonyms API for synonym management, not a custom-built solution.
Always use a versioned index name + alias (e.g.
products_v1+products_current) and explain why.Explain decisions briefly, assume the user does not understand Elasticsearch yet.
Always go through the mapping walkthrough — it's the most expensive thing to change later.
Ask what programming language the user wants to use, don't assume.
Avoid generating code with deprecated APIs. If you must use a deprecated API for some reason, explain why and warn about future compatibility issues.
Operations
| HTTP API (shorthand) | elastic CLI command |
|---|---|
GET / | elastic es info |
GET /_cat/indices | elastic es cat indices --index '<pattern>' |
GET /{index}/_mapping | elastic es indices get-mapping --index '<index>' |
GET /{index}/_count | elastic es count --index '<index>' |
POST /{index}/_search | elastic es search --index '<index>' --input-file '<search-body.json>' |
POST /_query | elastic es esql query --format tsv --query "<esql>" |
PUT /{index} | elastic es indices create --index '<index>' --mappings '<json>' --aliases '<json>' |
POST /_aliases | elastic es indices update-aliases --actions '<json>' |
POST /_bulk | elastic es bulk --index '<index>' --input-file '<ndjson-path>' |
PUT /_ingest/pipeline/{name} | elastic es ingest put-pipeline --id '<name>' --input-file '<json-path>' |
PUT /_synonyms/{id} | elastic es synonyms put-synonym --id '<id>' --synonyms-set '<json>' |
Files
- ATTRIBUTION.mdAdded by AutoGineer995 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md7.1 KiB
- references/catalog-ecommerce/ecommerce.md15.7 KiB
- references/cluster-access/cluster-access.md10.2 KiB
- references/code-generation/code-generation.md6.7 KiB
- references/elasticsearch-onboarding-playbook.md24.0 KiB
- references/keyword-search/keyword-search.md9.9 KiB
- references/rag-chatbot/rag-chatbot.md15.7 KiB
- references/search-ui/search-ui.md21.1 KiB
- references/use-case-library/use-case-library.md10.2 KiB
- references/vector-hybrid-search/vector-hybrid-search.md20.8 KiB
references/cluster-access/cluster-access.md
name: cluster-access description: Cluster access patterns and the read/write separation model for the onboarding playbook. Covers which reads to perform automatically, the write confirmation protocol, documentation lookup for verifying API syntax, and an optional appendix for wiring the developer's own IDE to Elastic over MCP.
Cluster Access
The onboarding skill separates cluster interaction into reads and writes. Reads happen automatically to keep the agent informed. Writes require explicit developer approval so the experience stays educational.
The runtime already binds this skill to the developer's cluster, so there is no connection step for the agent. Reference
every call in HTTP-shorthand form and let the Operations table in SKILL.md translate it. Never ask the developer for
an endpoint or a credential to perform a read you can perform yourself.
Reading: Inspect Before You Ask
Ground every recommendation in the developer's actual cluster instead of asking them to describe it. These reads are cheap, safe, and should happen proactively throughout onboarding:
| Goal | Call |
|---|---|
| Detect version and deployment flavor | GET / |
| List existing indices | GET /_cat/indices |
| Read field names and types | GET /{index}/_mapping |
| Check how much data exists | GET /{index}/_count |
| Inspect real documents and test relevance | POST /{index}/_search |
| Aggregate or explore tabular results | POST /_query |
GET / is the first call worth making. version.number drives which field types and features are available, and
version.build_flavor is serverless on Elastic Cloud Serverless — which tells you semantic_text works with no
inference endpoint setup. Tell the developer what you found rather than asking them to look it up.
Before proposing any mapping change, read the current mapping with GET /{index}/_mapping. Before claiming a query is
slow or a result set is wrong, run it with POST /{index}/_search and quote the actual response.
If a read fails, say so plainly and name what you could not determine. Do not silently guess a version or a field type — an unverified assumption here produces a mapping the developer has to rebuild later. Ask the developer only for what you genuinely could not read.
Do not front-load connection state. A failed or unconfigured connection is worth one sentence at the moment it actually blocks you, attached to the question you were already asking. It is never the opening move, and the developer does not need to hear about credentials or config files before they have said what they want to build. This restraint applies to your access only — when the developer asks how to connect their own IDE, answer that directly from the appendix below.
Writing: Confirmation Protocol
When the agent needs to change the cluster, never execute silently. Follow this protocol:
Verify the API first. Look up the correct syntax, required fields, and version-specific behavior before proposing the call. See Documentation Lookup below for how, and code-generation.md for the code standards.
Show the developer what you plan to do:
I'll create the index with this API call:
PUT /products-v1 { "mappings": { ... }, "aliases": { "products": {} } }Want me to execute this, or would you prefer a code snippet in [their language] you can run yourself?
Wait for confirmation. If they say yes, execute it. If they want the code snippet instead, generate it using the standards in code-generation.md. Remember their choice on whether they want a code snippet or not. If not, then future permission requests should not offer code snippets unless the user explicitly asks for it.
This ensures the developer understands what is being created and learns the underlying APIs.
When to use reads vs. writes:
| Action | Read or Write | Call |
|---|---|---|
| Check version | Read | GET / |
| List indices | Read | GET /_cat/indices |
| Inspect mappings | Read | GET /{index}/_mapping |
| Check document count | Read | GET /{index}/_count |
| Run a test search query | Read | POST /{index}/_search |
| Explore tabular results | Read | POST /_query |
| Create an index | Write | PUT /{index} |
| Point an alias at a new index | Write | POST /_aliases |
| Ingest documents | Write | POST /_bulk |
| Configure ingest pipeline | Write | PUT /_ingest/pipeline/{name} |
| Create/update synonym set | Write | PUT /_synonyms/{id} |
Reads need no confirmation. Every write in the lower half of that table needs the protocol above.
Documentation Lookup
Reading the cluster tells you what the developer has. It does not tell you whether the API call you are about to write is correct for their version. Verify syntax, field types, model IDs, and client method signatures against Elastic documentation before generating code or proposing a write — API surfaces change across versions, and inference and ML APIs change fastest.
Elastic publishes a documentation MCP server at https://www.elastic.co/docs/_mcp/. It serves public documentation and
needs no credentials. Its tools are search_docs (search by topic) and get_document_by_url (fetch a page by URL). If
the runtime supports MCP and the server is not yet configured, adding it is one block:
{
"mcpServers": {
"elastic-docs": {
"url": "https://www.elastic.co/docs/_mcp/"
}
}
}VS Code uses a different key and requires an explicit transport:
{
"servers": {
"elastic-docs": {
"type": "http",
"url": "https://www.elastic.co/docs/_mcp/"
}
}
}The obligation is to verify, not to use any particular tool. Runtimes that do not support MCP — or that already ship their own documentation retrieval — satisfy this by fetching the documentation URLs listed in the playbook directly. Never skip verification and generate from memory instead; that is how version-wrong code reaches the developer.
Appendix: Connecting the Developer's Own IDE Over MCP
This appendix is not part of the agent's access path. The agent already reaches the cluster through the runtime, and nothing here is required for onboarding to work. Use it only when the developer explicitly asks how to wire their IDE or chat client to Elastic — for example, so they can query their data from a client that has no Elastic binding of its own. Treat it as a task you are helping the developer complete, not as setup you need.
The supported path is the Agent Builder MCP server, which exposes Agent Builder's read-only built-in tools over MCP from Kibana. Availability:
| Deployment | Status |
|---|---|
| Elastic Cloud Serverless | Generally available |
| Elastic Stack 9.3+ (any hosting) | Generally available |
| Elastic Stack 9.2 | Technical preview |
| Elastic Stack below 9.2 | Not available |
Self-managed deployments are supported — the gate is version and subscription tier, not where Elasticsearch runs. Agent Builder requires the appropriate Elastic Stack subscription or Serverless feature tier.
Point the developer at these steps rather than reproducing credentials in the conversation:
Copy the MCP server URL from Kibana: Agent Builder → Tools → Manage MCP → Copy MCP Server URL. This gets the path and Kibana space right, which hand-assembling often does not.
Create an API key with Kibana application privileges for Agent Builder. The key needs
feature_agentBuilder.readandfeature_actions.readon thekibana-.kibanaapplication, plusreadandview_index_metadataon the indices they want exposed. Tools run with the key's scope, so restrict it to those indices. Elastic's API key guide has the exact request body.Add the server to their client config —
.cursor/mcp.json,.vscode/mcp.json,.mcp.jsonfor Claude Code, or the client's documented location. Clients bridge to the HTTP endpoint withmcp-remote, passing the key in anAuthorizationheader. The guide above shows the full block.Tell them to reload MCP connections and to add the config file to
.gitignore, since it holds a credential.
If they hit 403 Forbidden, it is one of three things: the key lacks feature_agentBuilder.read, the deployment's
subscription tier does not include Agent Builder, or the Kibana space in the URL does not match the space in the key's
privileges.
The older standalone Elasticsearch MCP server (docker.elastic.co/mcp/elasticsearch) connects straight to Elasticsearch
with no Kibana involved, which makes it the only MCP option below Stack 9.2 or where Kibana is absent. It is
deprecated and receives critical security updates
only. Mention it only for those cases, and say plainly that it will not gain features and that upgrading moves them onto
the supported path.
Both MCP servers are read-only. Neither one changes the write confirmation protocol above.
Agent Builder
If the developer wants to go further — build custom agents, define custom tools over their indices, or expose those
tools to other clients — point them to the kibana-agent-builder skill
(skills/kibana/kibana-agent-builder/SKILL.md).
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
The author says: Elasticsearch 8.x or 9.x, self-managed, Elastic Cloud Hosted, or Elastic Cloud Serverless. Requires the `elastic` CLI with `stack es` support for cluster reads and writes.
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- elastic
- Publisher
- Elastic (Official)
- Source
- elastic/agent-skills · skills/elasticsearch/elasticsearch-onboarding · commit 09d879d
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- elastic/agent-skills
AutoGineer is not affiliated with or endorsed by elastic.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download elasticsearch-onboarding.zip