SearXNG Control Plane MCP Server
This server provides MCP tools to manage and monitor a SearXNG search instance, including configuration inspection, search engine toggling, health checking, and container restart.
Inspect Settings (
inspect_settings): Read and parsesettings.ymlto view current configuration and list enabled/disabled engines.Enable/Disable Engines (
enable_engine,disable_engine): Turn specific search engines on or off.Set Engine Status (
set_engine_status): Explicitly set an engine's state to enabled or disabled in one call.Test API Health (
test_search_api_health): Send a test query to the search API and check response status, latency, and payload.Restart Container (
restart_searxng_container): Restart the SearXNG Docker container to apply changes or recover.
Manages SearXNG instances by inspecting configuration settings, toggling search engines, testing search API health, and restarting the SearXNG container.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SearXNG Control Plane MCP Servercheck the health of the search API"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SearXNG Control Plane MCP Server
An Model Context Protocol (MCP) server for managing SearXNG instances, configuration settings, search engine states, API health checking, and container lifecycle.
This repository is part of the TheNovaNodes Antigravity Agent Ecosystem. It provides standard MCP tools to interface securely and reliably with SearXNG, empowering ecosystem agents to inspect settings, toggle search engines dynamically, and monitor service health.
Features
Inspect Settings: Read and parse SearXNG configuration settings (
settings.yml), listing active/disabled engines and configuration parameters.Enable/Disable Search Engines: Toggle individual search engines on or off directly within
settings.yml.Health Testing: Test search API health by sending query requests and verifying HTTP response codes, latency, and JSON result payloads.
Container Control: Restart the SearXNG Docker container (
searxng-app) via subprocess.
Related MCP server: SearXNG MCP Server
Configuration
Environment variables can be used to override default settings:
Variable | Default Value | Description |
|
| Path to SearXNG |
|
| Base URL of SearXNG instance |
|
| Name of the Docker container running SearXNG |
Installation & Setup
pip install -e .Available MCP Tools
inspect_settings: Inspect current SearXNG configuration settings and list enabled/disabled search engines.enable_engine: Enable a specific search engine insettings.yml.disable_engine: Disable a specific search engine insettings.yml.set_engine_status: Set explicit enabled/disabled state for a search engine insettings.yml.test_search_api_health: Perform a health check query against the SearXNG search endpoint.restart_searxng_container: Restart the SearXNG Docker container via subprocess.
Ecosystem Context
As a part of the TheNovaNodes ecosystem, this project adheres to high-quality standards and ensures robustness for integrations with other Antigravity agents.
License
MIT
Available Tools
6 toolsdisable_engineB
Disable a specific search engine in SearXNG settings.yml.
Args: engine_name: Name of the engine to disable (e.g. 'duckduckgo'). settings_path: Optional path to settings.yml.
| Name | Required | Description | Default |
|---|---|---|---|
| engine_name | Yes | ||
| settings_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose side effects, but it only says 'Disable... in settings.yml'. It does not mention whether the change is persistent, reversible, requires a restart (e.g., via restart_searxng_container), or what happens if the engine name is invalid. This is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence plus an Args list with no filler or repetition of schema fields. Each element contributes to clarifying the operation, making it appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description is minimal for a config-modifying tool. It fails to explain whether SearXNG needs a restart, if the engine must exist, or how the result is returned. With no annotations and no post-steps, the description is incomplete for safe agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema properties have no descriptions (0% coverage), so the description compensates by defining engine_name with an example ('duckduckgo') and explaining settings_path as 'Optional path to settings.yml'. This adds meaning beyond the bare schema, though it could be more explicit about defaults and validation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Disable a specific search engine in SearXNG settings.yml'—a specific verb (disable) and resource (search engine in a config file). This distinguishes it from sibling tools like enable_engine and set_engine_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool over alternatives. The description does not reference sibling tools, prerequisites, or post-conditions. It merely states the action and parameters, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_engineB
Enable a specific search engine in SearXNG settings.yml.
Args: engine_name: Name of the engine to enable (e.g. 'duckduckgo'). settings_path: Optional path to settings.yml.
| Name | Required | Description | Default |
|---|---|---|---|
| engine_name | Yes | ||
| settings_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It merely says 'Enable' without revealing side effects such as modifying settings.yml, whether a restart is needed, permissions required, or reversibility of the change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single summary line followed by a compact Args section. Every sentence is useful, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose and parameters, and an output schema exists, so return values are handled. However, it lacks usage guidance and behavioral side effects, making it adequate but incomplete for a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by explaining engine_name with an example ('duckduckgo') and settings_path as optional. It does not clarify what happens when settings_path is omitted, but it does add meaningful parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Enable a specific search engine in SearXNG settings.yml', providing a specific verb, resource, and file scope. It differentiates from disable_engine and inspect_settings, but overlaps conceptually with set_engine_status without explicitly distinguishing between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It only documents the arguments and does not mention set_engine_status or disable_engine as related options, so the agent receives no usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_settingsA
Inspect SearXNG configuration settings and active/disabled engines from settings.yml.
Args: settings_path: Optional path to settings.yml. Defaults to SEARXNG_SETTINGS_PATH.
| Name | Required | Description | Default |
|---|---|---|---|
| settings_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add behavioral context by explaining the default path behavior (defaults to SEARXNG_SETTINGS_PATH) and the read-only nature implied by 'inspect'. However, it does not explicitly state that the tool makes no modifications or what happens if the path is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences. The primary purpose is stated first, followed by a clear argument explanation. No redundant content or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional param, no annotations, but with an output schema), the description adequately covers the essential function and the parameter. However, it lacks usage context and explicit behavioral guarantees (e.g., read-only disclosure), which are important for an agent to choose and invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no property descriptions (coverage 0%). The description compensates by explaining 'settings_path: Optional path to settings.yml. Defaults to SEARXNG_SETTINGS_PATH.' This adds meaning beyond the schema's bare type/title, clarifying optionality, purpose, and default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Inspect SearXNG configuration settings and active/disabled engines from settings.yml.' It uses a specific verb ('inspect') and identifies the resource (configuration and engine status), distinguishing it from sibling tools that modify engines or restart the container.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention conditions like 'before enabling/disabling engines' or any exclusions. There is no explicit or implied usage context beyond the basic action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restart_searxng_containerA
Restart the SearXNG Docker container via subprocess.
Args: container_name: Name of the docker container (defaults to SEARXNG_CONTAINER_NAME).
| Name | Required | Description | Default |
|---|---|---|---|
| container_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action 'Restart' and the mechanism 'via subprocess', without detailing side effects, required permissions, potential downtime, or error behavior. It lacks meaningful transparency about operational consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: a one-sentence action statement followed by a brief Args block. Every piece of text contributes useful information, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one optional parameter, no required inputs, output schema present), the description adequately covers the core action and parameter semantics. However, it omits any operational context such as prerequisites (e.g., Docker running) or expected effects beyond the restart, leaving minor gaps for a full understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides minimal info for the single optional parameter 'container_name' with a default of null, and schema description coverage is 0%. The description compensates by explaining that the parameter is the Docker container name and defaults to SEARXNG_CONTAINER_NAME, adding clarity about the default behavior and the parameter's meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Restart the SearXNG Docker container via subprocess.' It uses a specific verb and resource, and it is distinguishable from sibling tools which focus on settings and engine status, not container lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, or any context such as when a restart is needed. The description only mentions the default container name parameter, but no prerequisites, exclusions, or conditions under which the tool should be invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_engine_statusA
Enable or disable a search engine in settings.yml.
Args: engine_name: Name of the engine (e.g. 'google cse', 'duckduckgo', 'bing'). enabled: True to enable the engine, False to disable it. settings_path: Optional path to settings.yml. Defaults to SEARXNG_SETTINGS_PATH.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | ||
| engine_name | Yes | ||
| settings_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly states the core behavior (enable/disable in settings.yml) and notes the settings_path default via SEARXNG_SETTINGS_PATH, which is useful. However, it does not disclose whether changes persist across restarts, whether a restart/reload is required, or any permission/validation implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description leads with a crisp one-sentence purpose and then provides a compact, well-organized Args block. Every sentence adds value without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The parameter details are solid, and an output schema exists, reducing the need to describe return values. However, the tool is surrounded by enable_engine, disable_engine, and restart_searxng_container, yet the description does not clarify when to use this combined setter instead, nor whether a restart is required after modification. Given no annotations, this is a notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description's Args section thoroughly explains each parameter: engine_name with concrete examples, enabled as a boolean toggle, and settings_path as optional with a default. This fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb phrase ('Enable or disable') and clearly identifies the target resource ('a search engine in settings.yml'). However, it does not explicitly differentiate itself from sibling tools enable_engine and disable_engine, which likely have narrower, single-purpose behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus the sibling enable_engine/disable_engine tools. There is no mention of preconditions, follow-up steps, or scenarios where this generic setter is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_search_api_healthA
Test SearXNG Search API health by issuing a test query and measuring latency.
Args: url: Base URL or search endpoint of SearXNG instance (defaults to SEARXNG_URL). query: Test search query string (defaults to 'healthcheck').
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| query | No | healthcheck |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It discloses that a test query is issued and latency is measured, which is the core behavior. However, it does not mention side effects, authentication requirements, or error behavior. The description adds some value but lacks deeper context for a completely transparent disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured: a one-sentence summary followed by a brief Args list. Every sentence adds value without redundancy, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, and the description covers its purpose and both parameters. Since an output schema exists, the description need not detail return values. Minor gaps, such as not mentioning error handling or prerequisites, are acceptable given the tool's simplicity and presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters. It does this effectively by defining 'url' as the base URL/endpoint and 'query' as the test query string, including their defaults. This fully clarifies the meaning beyond the raw schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Test SearXNG Search API health by issuing a test query and measuring latency.' It uses a specific verb ('test') and resource ('SearXNG Search API'), and is distinguishable from sibling tools that manage settings or engine status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a clear usage context: when you need to check the health/latency of a SearXNG search API. While it does not explicitly list exclusions or alternatives, the tool is the only health-check among its siblings, making the intended use evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
disable_engine - First observed
enable_engine - First observed
inspect_settings - First observed
restart_searxng_container - First observed
set_engine_status - First observed
test_search_api_health
TDQS
Scored across 6 tools
The three engine control tools (set_engine_status, enable_engine, disable_engine) heavily overlap, with set_engine_status effectively combining the other two. This creates ambiguity about which tool to use for enabling/disabling an engine. The remaining tools are distinct but the redundancy lowers the overall clarity.
All tool names follow a consistent verb_noun pattern with snake_case (inspect_settings, set_engine_status, enable_engine, disable_engine, test_search_api_health, restart_searxng_container). The only inconsistency is that set_engine_status and enable/disable_engine represent overlapping actions, but the naming convention itself is uniform.
With six tools, the server is well-scoped for a control plane managing a SearXNG instance. Each tool covers a distinct area (settings inspection, engine status modification, health testing, container restart) without unnecessary bloat, making the count appropriate.
The surface covers core operations like inspecting settings, toggling engines, testing health, and restarting. However, it lacks lifecycle operations such as starting, stopping, or getting the container status, and there's no direct 'apply config' action. These gaps are notable for a control plane but not fatal.
Maintenance
Related MCP Connectors
Create, deploy, and operate MCP servers directly from your GitHub repositories.
Official SerpApi MCP server for Google, Bing, and other search engines.
Related MCP Servers
- AlicenseBqualityFmaintenanceAn MCP server for connecting agentic systems to search systems via searXNG.1129MIT
- AlicenseAqualityCmaintenanceAn MCP server that allows searching through public SearXNG instances by parsing HTML content into JSON results, enabling metasearch capabilities without requiring JSON API access.143 npm55MIT
- AlicenseAqualityAmaintenanceSelf-contained SearXNG MCP server in Docker. Aggregates 200+ search engines across 30+ categories with multi-page fanout, autocomplete, and engine discovery. Dual transport (HTTP + stdio), API key auth, and built-in Web UI reverse proxy.310MIT
- AlicenseAqualityDmaintenanceAn MCP server that integrates the SearXNG API for web search and URL content extraction with advanced features like pagination, caching, and proxy support.49,324 npm2MIT