Octodet Elasticsearch MCP-Server
Übersicht
Octodet Elasticsearch MCP Server
Der Octodet Elasticsearch MCP Server ist ein leistungsstarker Model Context Protocol (MCP) Server, der für eine nahtlose Interaktion mit Elasticsearch-Clustern entwickelt wurde. Er bietet eine standardisierte Möglichkeit für LLM-gestützte Anwendungen, verschiedene Operationen wie Suchen, Aktualisieren und Verwalten von Daten innerhalb von Elasticsearch durchzuführen.
Funktionen
- Vollständige Elasticsearch-Operationen: Führen Sie mühelos vollständige CRUD-Operationen auf Dokumenten und Indizes aus.
- Bulk-Operationen: Verbessern Sie die Leistung, indem Sie mehrere Operationen in einem einzigen API-Aufruf verarbeiten.
- Abfragebasierte Updates/Löschungen: Ändern oder entfernen Sie Dokumente basierend auf spezifischen Abfragen.
- Clusterverwaltung: Überwachen Sie die Gesundheit Ihres Elasticsearch-Clusters, einschließlich Shards und Vorlagen.
- Erweiterte Suche: Nutzen Sie die vollen Möglichkeiten der Elasticsearch DSL-Abfragen mit integrierter Hervorhebungsunterstützung.
Installation
Als NPM-Paket
Um den Octodet Elasticsearch MCP Server global zu installieren, führen Sie aus:
npm install -g @octodet/elasticsearch-mcp
Alternativ können Sie ihn direkt mit npx verwenden:
npx @octodet/elasticsearch-mcp
Aus dem Quellcode
- Klonen Sie das Repository.
- Installieren Sie die erforderlichen Abhängigkeiten:
npm install
- Bauen Sie den Server:
npm run build
Integration mit MCP-Clients
VS Code-Integration
Um sich mit der VS Code MCP-Erweiterung zu integrieren, fügen Sie die folgende Konfiguration zu Ihrer settings.json
hinzu:
"mcp.servers": {
"elasticsearch": {
"command": "npx",
"args": [
"-y", "@octodet/elasticsearch-mcp"
],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
Claude Desktop-Integration
Für Claude Desktop konfigurieren Sie Ihre Einstellungen wie folgt:
{
"mcpServers": {
"elasticsearch": {
"command": "npx",
"args": ["-y", "@octodet/elasticsearch-mcp"],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}
Für die lokale Entwicklung
Wenn Sie den MCP-Server lokal entwickeln, konfigurieren Sie Ihre Clients so, dass sie Ihren lokalen Build verwenden:
{
"mcpServers": {
"elasticsearch": {
"command": "node",
"args": ["path/to/build/index.js"],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}
Konfiguration
Der Server kann mit den folgenden Umgebungsvariablen konfiguriert werden:
Variable | Beschreibung | Standardwert |
---|---|---|
ES_URL | URL des Elasticsearch-Servers | http://localhost:9200 |
ES_API_KEY | API-Schlüssel zur Authentifizierung | |
ES_USERNAME | Benutzername zur Authentifizierung | |
ES_PASSWORD | Passwort zur Authentifizierung | |
ES_CA_CERT | Pfad zum benutzerdefinierten CA-Zertifikat | |
ES_VERSION | Elasticsearch-Version (8 oder 9) | 8 |
ES_SSL_SKIP_VERIFY | SSL-Überprüfung überspringen | false |
ES_PATH_PREFIX | Pfadpräfix für Elasticsearch |
Werkzeuge
Der Server umfasst 16 MCP-Werkzeuge für verschiedene Elasticsearch-Operationen, die jeweils mit erforderlichen und optionalen Parametern dokumentiert sind.
1. Indizes auflisten
Rufen Sie eine Liste aller verfügbaren Elasticsearch-Indizes mit detaillierten Informationen ab.
Parameter:
indexPattern
(optional, string): Muster zum Filtern von Indizes (z. B. "logs-", "my-index-")
Beispiel:
{
"indexPattern": "logs-*"
}
2. Mappings abrufen
Holen Sie sich die Feldzuordnungen für einen bestimmten Elasticsearch-Index.
Parameter:
index
(erforderlich, string): Der Name des Index, für den die Zuordnungen abgerufen werden sollen.
Beispiel:
{
"index": "my-index"
}
3. Suchen
Führen Sie eine Elasticsearch-Suche mit der bereitgestellten Abfrage-DSL und Hervorhebung durch.
Parameter:
index
(erforderlich, string): Der Index oder die Indizes, in denen gesucht werden soll (unterstützt durch Kommas getrennte Werte).queryBody
(erforderlich, object): Der Elasticsearch-Abfrage-DSL-Body.highlight
(optional, boolean): Hervorhebung der Suchergebnisse aktivieren (Standard: true).
Beispiel:
{
"index": "my-index",
"queryBody": {
"query": {
"match": {
"content": "Suchbegriff"
}
},
"size": 10,
"from": 0,
"sort": [{ "_score": { "order": "desc" } }]
},
"highlight": true
}
4. Cluster-Gesundheit abrufen
Erhalten Sie Gesundheitsinformationen über das Elasticsearch-Cluster.
Parameter:
- Keine erforderlich.
Beispiel:
{}
5. Shards abrufen
Rufen Sie Shard-Informationen für alle oder spezifische Indizes ab.
Parameter:
index
(optional, string): Spezifischer Index, für den Shard-Informationen abgerufen werden sollen. Wenn weggelassen, werden Shards für alle Indizes zurückgegeben.
Beispiel:
{
"index": "my-index"
}
6. Dokument hinzufügen
Fügen Sie ein neues Dokument in einen bestimmten Elasticsearch-Index ein.
Parameter:
index
(erforderlich, string): Der Index, in den das Dokument hinzugefügt werden soll.document
(erforderlich, object): Der Inhalt des hinzuzufügenden Dokuments.id
(optional, string): Dokument-ID. Wenn weggelassen, generiert Elasticsearch automatisch eine.
Beispiel:
{
"index": "my-index",
"id": "doc1",
"document": {
"title": "Mein Dokument",
"content": "Inhalt des Dokuments hier",
"timestamp": "2025-06-23T10:30:00Z",
"tags": ["wichtig", "entwurf"]
}
}
7. Dokument aktualisieren
Ändern Sie ein vorhandenes Dokument in einem bestimmten Elasticsearch-Index.
Parameter:
index
(erforderlich, string): Der Index, der das Dokument enthält.id
(erforderlich, string): Die ID des zu aktualisierenden Dokuments.document
(erforderlich, object): Das partielle Dokument mit den zu aktualisierenden Feldern.
Beispiel:
{
"index": "my-index",
"id": "doc1",
"document": {
"title": "Aktualisierter Dokumenttitel",
"last_modified": "2025-06-23T10:30:00Z"
}
}
8. Dokument löschen
Entfernen Sie ein Dokument aus einem bestimmten Elasticsearch-Index.
Parameter:
index
(erforderlich, string): Der Index, der das Dokument enthält.id
(erforderlich, string): Die ID des zu löschenden Dokuments.
Beispiel:
{
"index": "my-index",
"id": "doc1"
}
9. Aktualisieren nach Abfrage
Aktualisieren Sie Dokumente in einem Elasticsearch-Index basierend auf einer Abfrage.
Parameter:
index
(erforderlich, string): Der Index, in dem Dokumente aktualisiert werden sollen.query
(erforderlich, object): Elasticsearch-Abfrage zum Abgleichen von Dokumenten für die Aktualisierung.script
(erforderlich, object): Skript, das zur Aktualisierung der übereinstimmenden Dokumente ausgeführt werden soll.conflicts
(optional, string): Wie mit Versionskonflikten umgegangen werden soll ("abort" oder "proceed", Standard: "abort").refresh
(optional, boolean): Ob der Index nach der Operation aktualisiert werden soll (Standard: false).
Beispiel:
{
"index": "my-index",
"query": {
"term": {
"status": "aktiv"
}
},
"script": {
"source": "ctx._source.status = params.newStatus; ctx._source.updated_at = params.timestamp",
"params": {
"newStatus": "inaktiv",
"timestamp": "2025-06-23T10:30:00Z"
}
},
"conflicts": "proceed",
"refresh": true
}
10. Löschen nach Abfrage
Löschen Sie Dokumente in einem Elasticsearch-Index basierend auf einer Abfrage.
Parameter:
index
(erforderlich, string): Der Index, aus dem Dokumente gelöscht werden sollen.query
(erforderlich, object): Elasticsearch-Abfrage zum Abgleichen von Dokumenten für die Löschung.conflicts
(optional, string): Wie mit Versionskonflikten umgegangen werden soll ("abort" oder "proceed", Standard: "abort").refresh
(optional, boolean): Ob der Index nach der Operation aktualisiert werden soll (Standard: false).
Beispiel:
{
"index": "my-index",
"query": {
"range": {
"created_date": {
"lt": "2025-01-01"
}
}
},
"conflicts": "proceed",
"refresh": true
}
11. Bulk-Operationen
Führen Sie mehrere Dokumentoperationen in einem einzigen API-Aufruf zur Verbesserung der Leistung aus.
Parameter:
operations
(erforderlich, array): Array von Operationsobjekten, die jeweils enthalten:action
(erforderlich, string): Der Operationstyp ("index", "create", "update" oder "delete").index
(erforderlich, string): Der Index für diese Operation.id
(optional, string): Dokument-ID (erforderlich für Update/Löschung, optional für Index/Erstellung).document
(bedingt, object): Dokumentinhalt (erforderlich für Index/Erstellung/Aktualisierung).
Beispiel:
{
"operations": [
{
"action": "index",
"index": "my-index",
"id": "doc1",
"document": { "title": "Dokument 1", "content": "Inhalt hier" }
},
{
"action": "update",
"index": "my-index",
"id": "doc2",
"document": { "title": "Aktualisierter Titel" }
},
{
"action": "delete",
"index": "my-index",
"id": "doc3"
}
]
}
12. Index erstellen
Erstellen Sie einen neuen Elasticsearch-Index mit optionalen Einstellungen und Zuordnungen.
Parameter:
index
(erforderlich, string): Der Name des zu erstellenden Index.settings
(optional, object): Indexeinstellungen wie Anzahl der Shards, Replikate usw.mappings
(optional, object): Feldzuordnungen, die definieren, wie Dokumente indiziert werden sollen.
Beispiel:
{
"index": "new-index",
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"custom_analyzer": {
"type": "standard",
"stopwords": "_english_"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "custom_analyzer"
},
"created": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss'Z'"
},
"tags": {
"type": "keyword"
}
}
}
}
13. Index löschen
Löschen Sie einen Elasticsearch-Index dauerhaft.
Parameter:
index
(erforderlich, string): Der Name des zu löschenden Index.
Beispiel:
{
"index": "my-index"
}
14. Dokumente zählen
Zählen Sie Dokumente in einem Index, optional gefiltert durch eine Abfrage.
Parameter:
index
(erforderlich, string): Der Index, in dem Dokumente gezählt werden sollen.query
(optional, object): Elasticsearch-Abfrage zum Filtern von Dokumenten für die Zählung.
Beispiel:
{
"index": "my-index",
"query": {
"bool": {
"must": [
{ "term": { "status": "aktiv" } },
{ "range": { "created_date": { "gte": "2025-01-01" } } }
]
}
}
}
15. Vorlagen abrufen
Rufen Sie Indexvorlagen von Elasticsearch ab.
Parameter:
name
(optional, string): Spezifischer Vorlagenname zum Abrufen. Wenn weggelassen, werden alle Vorlagen zurückgegeben.
Beispiel:
{
"name": "logs-template"
}
16. Aliase abrufen
Holen Sie sich Indexalias von Elasticsearch.
Parameter:
name
(optional, string): Spezifischer Aliasname zum Abrufen. Wenn weggelassen, werden alle Aliase zurückgegeben.
Beispiel:
{
"name": "logs-alias"
}
Entwicklung
Im Entwicklungsmodus ausführen
Um den Server im Überwachungsmodus während der Entwicklung auszuführen, verwenden Sie:
npm run dev
Protokollimplementierung
Dieser Server implementiert das Model Context Protocol, um eine standardisierte Kommunikation zwischen LLM-Clients und Elasticsearch zu erleichtern. Er bietet eine umfassende Sammlung von Werkzeugen, die von MCP-Clients aufgerufen werden können, um verschiedene Elasticsearch-Operationen durchzuführen.
Hinzufügen neuer Werkzeuge
Um ein neues Werkzeug zum Server hinzuzufügen:
- Definieren Sie das Werkzeug in
src/index.ts
unter Verwendung des Registrierungsformats des MCP-Servers. - Implementieren Sie die erforderliche Funktionalität in
src/utils/elasticsearchService.ts
. - Aktualisieren Sie dieses README, um das neue Werkzeug zu dokumentieren.
Andere MCP-Clients
Der Octodet Elasticsearch MCP Server kann mit jedem MCP-kompatiblen Client verwendet werden, einschließlich:
- OpenAI's ChatGPT über MCP-Plugins
- Anthropic's Claude Desktop
- Claude in VS Code
- Benutzerdefinierte Anwendungen, die das MCP SDK verwenden
Programmatische Nutzung
Sie können den Server auch programmgesteuert in Ihren Node.js-Anwendungen verwenden:
import { createOctodetElasticsearchMcpServer } from "@octodet/elasticsearch-mcp";
import { CustomTransport } from "@modelcontextprotocol/sdk/server";
// Konfigurieren Sie die Elasticsearch-Verbindung
const config = {
url: "http://localhost:9200",
apiKey: "your_api_key",
version: "8",
};
// Erstellen und starten Sie den Server
async function startServer() {
const server = await createOctodetElasticsearchMcpServer(config);
// Verbinden Sie sich mit Ihrem benutzerdefinierten Transport
const transport = new CustomTransport();
await server.connect(transport);
console.log("Elasticsearch MCP-Server gestartet");
}
startServer().catch(console.error);
Lizenz
Dieses Projekt ist unter der MIT-Lizenz lizenziert - siehe die LICENSE Datei für Details.
Detail
Octodet Elasticsearch MCP Server
A Model Context Protocol (MCP) server for Elasticsearch operations, providing a comprehensive set of tools for interacting with Elasticsearch clusters through the standardized Model Context Protocol. This server enables LLM-powered applications to search, update, and manage Elasticsearch data.
Features
- Complete Elasticsearch Operations: Full CRUD operations for documents and indices
- Bulk Operations: Process multiple operations in a single API call
- Query-Based Updates/Deletes: Modify or remove documents based on queries
- Cluster Management: Monitor health, shards, and templates
- Advanced Search: Full support for Elasticsearch DSL queries with highlighting
Installation
As an NPM Package
Install the package globally:
npm install -g @octodet/elasticsearch-mcp
Or use it directly with npx:
npx @octodet/elasticsearch-mcp
From Source
- Clone this repository
- Install dependencies:
npm install
- Build the server:
npm run build
Integration with MCP Clients
VS Code Integration
Add the following configuration to your VS Code settings.json to integrate with the VS Code MCP extension:
"mcp.servers": {
"elasticsearch": {
"command": "npx",
"args": [
"-y", "@octodet/elasticsearch-mcp"
],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
Claude Desktop Integration
Configure in your Claude Desktop configuration file:
{
"mcpServers": {
"elasticsearch": {
"command": "npx",
"args": ["-y", "@octodet/elasticsearch-mcp"],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}
For Local Development
If you're developing the MCP server locally, you can configure the clients to use your local build:
{
"mcpServers": {
"elasticsearch": {
"command": "node",
"args": ["path/to/build/index.js"],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}
Configuration
The server uses the following environment variables for configuration:
| Variable | Description | Default | | | | | | ES_URL | Elasticsearch server URL | http://localhost:9200 | | ES_API_KEY | API key for authentication | | | ES_USERNAME | Username for authentication | | | ES_PASSWORD | Password for authentication | | | ES_CA_CERT | Path to custom CA certificate | | | ES_VERSION | Elasticsearch version (8 or 9) | 8 | | ES_SSL_SKIP_VERIFY | Skip SSL verification | false | | ES_PATH_PREFIX | Path prefix for Elasticsearch | |
Tools
The server provides 16 MCP tools for Elasticsearch operations. Each tool is documented with its required and optional parameters:
1. List Indices
List all available Elasticsearch indices with detailed information.
Parameters:
indexPattern
(optional, string): Pattern to filter indices (e.g., "logs-", "my-index-")
Example:
{
"indexPattern": "logs-*"
}
2. Get Mappings
Get field mappings for a specific Elasticsearch index.
Parameters:
index
(required, string): The name of the index to get mappings for
Example:
{
"index": "my-index"
}
3. Search
Perform an Elasticsearch search with the provided query DSL and highlighting.
Parameters:
index
(required, string): The index or indices to search in (supports comma-separated values)queryBody
(required, object): The Elasticsearch query DSL bodyhighlight
(optional, boolean): Enable search result highlighting (default: true)
Example:
{
"index": "my-index",
"queryBody": {
"query": {
"match": {
"content": "search term"
}
},
"size": 10,
"from": 0,
"sort": [{ "_score": { "order": "desc" } }]
},
"highlight": true
}
4. Get Cluster Health
Get health information about the Elasticsearch cluster.
Parameters:
- None required
Example:
{}
5. Get Shards
Get shard information for all or specific indices.
Parameters:
index
(optional, string): Specific index to get shard information for. If omitted, returns shards for all indices
Example:
{
"index": "my-index"
}
6. Add Document
Add a new document to a specific Elasticsearch index.
Parameters:
index
(required, string): The index to add the document todocument
(required, object): The document content to addid
(optional, string): Document ID. If omitted, Elasticsearch will generate one automatically
Example:
{
"index": "my-index",
"id": "doc1",
"document": {
"title": "My Document",
"content": "Document content here",
"timestamp": "2025-06-23T10:30:00Z",
"tags": ["important", "draft"]
}
}
7. Update Document
Update an existing document in a specific Elasticsearch index.
Parameters:
index
(required, string): The index containing the documentid
(required, string): The ID of the document to updatedocument
(required, object): The partial document with fields to update
Example:
{
"index": "my-index",
"id": "doc1",
"document": {
"title": "Updated Document Title",
"last_modified": "2025-06-23T10:30:00Z"
}
}
8. Delete Document
Delete a document from a specific Elasticsearch index.
Parameters:
index
(required, string): The index containing the documentid
(required, string): The ID of the document to delete
Example:
{
"index": "my-index",
"id": "doc1"
}
9. Update By Query
Update documents in an Elasticsearch index based on a query.
Parameters:
index
(required, string): The index to update documents inquery
(required, object): Elasticsearch query to match documents for updatescript
(required, object): Script to execute for updating matched documentsconflicts
(optional, string): How to handle version conflicts ("abort" or "proceed", default: "abort")refresh
(optional, boolean): Whether to refresh the index after the operation (default: false)
Example:
{
"index": "my-index",
"query": {
"term": {
"status": "active"
}
},
"script": {
"source": "ctx._source.status = params.newStatus; ctx._source.updated_at = params.timestamp",
"params": {
"newStatus": "inactive",
"timestamp": "2025-06-23T10:30:00Z"
}
},
"conflicts": "proceed",
"refresh": true
}
10. Delete By Query
Delete documents in an Elasticsearch index based on a query.
Parameters:
index
(required, string): The index to delete documents fromquery
(required, object): Elasticsearch query to match documents for deletionconflicts
(optional, string): How to handle version conflicts ("abort" or "proceed", default: "abort")refresh
(optional, boolean): Whether to refresh the index after the operation (default: false)
Example:
{
"index": "my-index",
"query": {
"range": {
"created_date": {
"lt": "2025-01-01"
}
}
},
"conflicts": "proceed",
"refresh": true
}
11. Bulk Operations
Perform multiple document operations in a single API call for better performance.
Parameters:
operations
(required, array): Array of operation objects, each containing:action
(required, string): The operation type ("index", "create", "update", or "delete")index
(required, string): The index for this operationid
(optional, string): Document ID (required for update/delete, optional for index/create)document
(conditional, object): Document content (required for index/create/update operations)
Example:
{
"operations": [
{
"action": "index",
"index": "my-index",
"id": "doc1",
"document": { "title": "Document 1", "content": "Content here" }
},
{
"action": "update",
"index": "my-index",
"id": "doc2",
"document": { "title": "Updated Title" }
},
{
"action": "delete",
"index": "my-index",
"id": "doc3"
}
]
}
12. Create Index
Create a new Elasticsearch index with optional settings and mappings.
Parameters:
index
(required, string): The name of the index to createsettings
(optional, object): Index settings like number of shards, replicas, etc.mappings
(optional, object): Field mappings defining how documents should be indexed
Example:
{
"index": "new-index",
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"custom_analyzer": {
"type": "standard",
"stopwords": "_english_"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "custom_analyzer"
},
"created": {
"type": "date",
"format": "yyyy-MM-dd'T'HH:mm:ss'Z'"
},
"tags": {
"type": "keyword"
}
}
}
}
13. Delete Index
Delete an Elasticsearch index permanently.
Parameters:
index
(required, string): The name of the index to delete
Example:
{
"index": "my-index"
}
14. Count Documents
Count documents in an index, optionally filtered by a query.
Parameters:
index
(required, string): The index to count documents inquery
(optional, object): Elasticsearch query to filter documents for counting
Example:
{
"index": "my-index",
"query": {
"bool": {
"must": [
{ "term": { "status": "active" } },
{ "range": { "created_date": { "gte": "2025-01-01" } } }
]
}
}
}
15. Get Templates
Get index templates from Elasticsearch.
Parameters:
name
(optional, string): Specific template name to retrieve. If omitted, returns all templates
Example:
{
"name": "logs-template"
}
16. Get Aliases
Get index aliases from Elasticsearch.
Parameters:
name
(optional, string): Specific alias name to retrieve. If omitted, returns all aliases
Example:
{
"name": "logs-alias"
}
Development
Running in Development Mode
Run the server in watch mode during development:
npm run dev
Protocol Implementation
This server implements the Model Context Protocol to enable standardized communication between LLM clients and Elasticsearch. It provides a set of tools that can be invoked by MCP clients to perform various Elasticsearch operations.
Adding New Tools
To add a new tool to the server:
- Define the tool in
src/index.ts
using the MCP server's tool registration format - Implement the necessary functionality in
src/utils/elasticsearchService.ts
- Update this README to document the new tool
Other MCP Clients
This server can be used with any MCP-compatible client, including:
- OpenAI's ChatGPT via MCP plugins
- Anthropic's Claude Desktop
- Claude in VS Code
- Custom applications using the MCP SDK
Programmatic Usage
You can also use the server programmatically in your Node.js applications:
import { createOctodetElasticsearchMcpServer } from "@octodet/elasticsearch-mcp";
import { CustomTransport } from "@modelcontextprotocol/sdk/server";
// Configure the Elasticsearch connection
const config = {
url: "http://localhost:9200",
apiKey: "your_api_key",
version: "8",
};
// Create and start the server
async function startServer() {
const server = await createOctodetElasticsearchMcpServer(config);
// Connect to your custom transport
const transport = new CustomTransport();
await server.connect(transport);
console.log("Elasticsearch MCP server started");
}
startServer().catch(console.error);
License
This project is licensed under the MIT License - see the LICENSE file for details.
Serverkonfiguration
{
"mcpServers": {
"elasticsearch": {
"command": "npx",
"args": [
"-y",
"@octodet/elasticsearch-mcp"
],
"env": {
"ES_URL": "http://localhost:9200",
"ES_API_KEY": "your_api_key",
"ES_VERSION": "8"
}
}
}
}