zsvirt-mcp-server
OfficialZSvirt MCP Server
English | įŽäŊ䏿
An MCP server that enables AI assistants to dynamically discover and invoke more than 2,000 ZSvirt APIs.
Features
API search: Search ZStack APIs by keyword with fuzzy matching
API description: Retrieve detailed parameter documentation for an API
API execution: Invoke a ZStack API and return its result
Metric search: Search available monitoring metrics
Metric data retrieval: Retrieve monitoring data for a specified metric
Related MCP server: CloudStack MCP Server
Installation
# Install from PyPI
pip install zsvirt-mcp-server
# Or install with uv
uv pip install zsvirt-mcp-serverđĄ You can also run the server directly with
uvxorpipx runwithout installing it. See Usage.
Configuration
Set the following environment variables:
export ZSTACK_API_URL="http://localhost:8080" # ZStack API endpoint
export ZSTACK_ALLOW_ALL_API="false" # Allow write operations (optional; default: false)
# Authentication method 1: account and password (automatically logs in and obtains a session)
export ZSTACK_ACCOUNT="admin" # Account name
export ZSTACK_PASSWORD="your-password" # Plain-text password
# Authentication method 2: use an existing session ID
# This method takes precedence over account/password authentication.
export ZSTACK_SESSION_ID="your-session-uuid" # Existing session UUID
# Query response controls (optional)
export ZSTACK_QUERY_DEFAULT_LIMIT="50" # Default Query API limit; set to 0 to disable
export ZSTACK_RESPONSE_SIZE_LIMIT="65536" # Maximum response size in bytes; set to 0 to disableAuthentication methods
Method | Environment variables | Description |
Account and password |
| Automatically logs in and obtains a session |
Session ID |
| Uses an existing session and takes precedence over account/password authentication |
đĄ If both
ZSTACK_SESSION_IDand account/password credentials are configured, the session ID takes precedence.
Security
By default, only read-only APIs are allowed, including:
Query*â query operationsGet*â get operationsList*â list operationsDescribe*â describe operationsCheck*â check operationsCount*â count operationsOther read-only operations
To enable write APIs such as CreateVmInstance and DeleteVolume, set:
export ZSTACK_ALLOW_ALL_API="true"â ī¸ Warning: When write operations are enabled, an AI assistant can create, delete, and modify resources. Enable this option with care.
Query response controls
The server injects limit=50 into Query APIs by default to prevent a single request from filling the model context window. If a response exceeds 64 KiB, the server truncates the inventories list while preserving valid JSON.
Environment variable | Default | Description |
|
| Default limit injected when a Query API does not specify one; set to |
|
| Maximum response size in bytes; oversized responses are truncated; set to |
An explicitly supplied
limitis never overwritten.A truncated response includes a
_truncationfield suggesting pagination withlimit/startor response reduction withfields.
Usage
Run as an MCP server
# Run directly with uvx (no installation required)
uvx zsvirt-mcp-server
# Or use pipx
pipx run zsvirt-mcp-server
# Run the installed command
zsvirt-mcp-serverSSE transport
The default transport is stdio. Use command-line options or environment variables to enable SSE:
# Command-line options
uvx zsvirt-mcp-server --transport sse --host 0.0.0.0 --port 8000
# Environment variables
export MCP_TRANSPORT="sse"
export MCP_HOST="0.0.0.0"
export MCP_PORT="8000"
export MCP_PATH="/sse" # Optional
uvx zsvirt-mcp-serverThe server also supports the native FastMCP variables
FASTMCP_HOST,FASTMCP_PORT, andFASTMCP_MOUNT_PATH.
Streamable HTTP transport
# Command-line options
uvx zsvirt-mcp-server --transport streamable-http --host 0.0.0.0 --port 8000 --streamable-path /mcp
# Environment variables
export MCP_TRANSPORT="streamable-http"
export MCP_HOST="0.0.0.0"
export MCP_PORT="8000"
export MCP_STREAMABLE_PATH="/mcp" # Optional
uvx zsvirt-mcp-serverThe server also supports
FASTMCP_STREAMABLE_HTTP_PATH.
HTTP header authentication (multi-tenant mode)
In SSE or Streamable HTTP mode, an administrator can run a shared MCP server while each user supplies their own credentials through HTTP headers.
HTTP header | Environment variable | Description |
|
| Account name |
|
| Password |
|
| Existing session; takes precedence over account/password authentication |
|
| ZStack management node endpoint; allows proxying multiple environments |
Credential precedence: HTTP headers > environment variables.
# Start a shared MCP server
ZSTACK_ALLOW_ALL_API=false uvx zsvirt-mcp-server --transport streamable-http --host 0.0.0.0 --port 8000Users can configure credentials as HTTP headers in an MCP client:
{
"mcpServers": {
"zstack": {
"transport": "streamable-http",
"url": "http://mcp-server:8000/mcp",
"headers": {
"X-ZStack-Account": "user-a",
"X-ZStack-Password": "password-a",
"X-ZStack-API-URL": "http://zstack-env-1:8080"
}
}
}
}Sessions are cached and reused for the same account.
Requests with different
X-ZStack-API-URLvalues are routed to different ZStack environments.stdio mode has no HTTP headers and automatically falls back to environment-variable authentication.
Claude Desktop configuration
Add the server to claude_desktop_config.json.
Method 1: account and password
{
"mcpServers": {
"zstack": {
"command": "uvx",
"args": ["zsvirt-mcp-server"],
"env": {
"ZSTACK_API_URL": "http://your-zstack-server:8080",
"ZSTACK_ACCOUNT": "admin",
"ZSTACK_PASSWORD": "your-password",
"ZSTACK_ALLOW_ALL_API": "false"
}
}
}
}Method 2: session ID
{
"mcpServers": {
"zstack": {
"command": "uvx",
"args": ["zsvirt-mcp-server"],
"env": {
"ZSTACK_API_URL": "http://your-zstack-server:8080",
"ZSTACK_SESSION_ID": "your-session-uuid",
"ZSTACK_ALLOW_ALL_API": "false"
}
}
}
}đĄ Set
ZSTACK_ALLOW_ALL_APIto"true"to enable create, delete, and modify operations.
Available tools
1. search_api
Search ZStack APIs by keyword.
Parameters:
keywords(list[str]): Search keywords, for example["Query", "Vm"]category(str, optional): Filter by categorylimit(int, default:15): Maximum number of results
2. describe_api
Retrieve detailed parameter documentation for an API.
Parameters:
api_name(str): API name, for exampleQueryVmInstance
3. execute_api
Invoke a ZStack API.
Parameters:
api_name(str): API nameparameters(dict): API parameters
4. search_metric
Search available monitoring metrics.
Parameters:
keywords(list[str]): Search keywordsnamespace(str, optional): Fuzzy namespace filter, such asvmorhostlimit(int, default:20): Maximum number of resultsmatch_mode(str, default:or): Keyword matching mode:andororprefer_namespaces(list[str], optional): Namespaces to rank first; defaults to["ZStack/VM", "ZStack/Host"]
đĄ If the namespace is unknown, omit it first. Search results include namespace values that can be used in a subsequent request.
The default
match_modeisor. Passandexplicitly to require all keywords.Metric names can overlap across namespaces. Specify
namespaceorprefer_namespacesto control result ranking.
5. get_metric_data
Retrieve monitoring data.
Parameters:
namespace(str): Namespacemetric_name(str): Metric namestart_time(str | int, optional): Start time as ISO text or a Unix timestamp in secondsend_time(str | int, optional): End time as ISO text or a Unix timestamp in secondsperiod(int, default:60): Sampling period in secondslabels(list[str] | dict, optional): Label filters such as["VMUuid=xxx"]or{"VMUuid": "xxx"}summary_only(bool, optional): Return only statistics: count, maximum, minimum, average, variance, and standard deviation
Response size guidance:
estimated_points = ceil((end_time - start_time) / period) * series_countseries_count is the number of unique label combinations. Omitting labels can return multiple series. Reduce output size by shortening the time range, increasing period, or adding label filters.
6. get_metric_summary
Retrieve aggregated Top-N metric results grouped by a label key.
Parameters:
namespace(str): Namespacemetric_name(str): Metric namelabel_key(str): Grouping label, such asVMUuidorHostUuidmetric_names(list[str], optional): Metrics to combine, such as inbound and outbound metricsstart_time(str | int, optional): Start time as ISO text or a Unix timestamp in secondsend_time(str | int, optional): End time as ISO text or a Unix timestamp in secondsperiod(int, default:60): Sampling period in secondsaggregate(str, default:max): Per-metric aggregation:max,avg,sum, ormincombine(str, default:sum): Multi-metric combination:sum,avg,max, orminthreshold_op(str, optional): Comparison operator:>,>=,<,<=,==, or!=threshold_value(number, optional): Threshold valuetop_n(int, default:10): Number of resultsresolve_resource(str, optional):vmorhost, used to resolve resource names
Query API condition syntax
For Query APIs, the conditions parameter supports these operators:
Operator | Meaning | Example |
| Equal |
|
| Not equal |
|
| Greater than |
|
| Greater than or equal |
|
| Less than |
|
| Less than or equal | |
| Fuzzy match ( |
|
| Fuzzy non-match | |
| Regular-expression match |
|
| Regular-expression non-match | |
| Is null |
|
| Is not null | |
| In list |
|
| Not in list |
|
conditions format:
{
"conditions": [
{"name": "uuid", "op": "=", "value": "xxx"},
{"name": "state", "op": "in", "value": "Running,Stopped"}
]
}Example interaction
User: "Show me the details of the VM whose UUID starts with ae6e57a0."
The AI assistant will:
Call
search_api(keywords=["Query", "Vm", "Instance"])Call
describe_api(api_name="QueryVmInstance")Call
execute_api(api_name="QueryVmInstance", parameters={"conditions": [{"name": "uuid", "op": "?=", "value": "ae6e57a0%"}]})
Development
# Clone the repository
git clone https://github.com/ZSvirt/zsvirt-mcp-server.git
cd zsvirt-mcp-server
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytestLicense
MIT
Available Tools
6 toolsdescribe_apiA
čˇåæåŽ ZStack API įč¯Ļįģ忰蝴æ
Args: api_name: API åį§°īŧåĻ "QueryVmInstance"
Returns: API įį˛žįŽäŋĄæ¯ã寚äē Query APIīŧäģ čŋåæ ¸åŋåæ°å queryableFieldsã
| Name | Required | Description | Default |
|---|---|---|---|
| api_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It does disclose the return behavior, noting that Query APIs return only core parameters and queryableFields, which is useful context beyond the tool name. However, it does not mention potential errors, authentication needs, or other behavioral traits, leaving some gaps.
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 compact and well-structured, with a clear purpose statement followed by Args and Returns sections. Each sentence earns its place, and the example parameter value makes the usage instantly understandable.
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?
For a simple one-parameter tool with an output schema, the description is largely complete. It covers the purpose, parameter meaning, and return behavior. It could be slightly stronger by clarifying why a user would choose describe_api over search_api, but that is more of a usage-guideline gap than a completeness issue.
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 compensate. It explains that api_name is an API name and gives a concrete example, which is sufficient for this single-parameter tool. More detail about accepted formats or validation rules would push it higher, but the provided semantics are clear.
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 fetches detailed parameter documentation for a specified ZStack API, using a specific verb and resource. However, it does not explicitly differentiate itself from siblings like search_api or execute_api beyond the tool name.
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 the tool is used when you already know the API name and need its parameter details, illustrated by the example "QueryVmInstance". There is no explicit guidance on when to prefer this tool over search_api or execute_api, so usage context is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_apiA
æ§čĄ ZStack API
æŗ¨æ: éģ莤åĒå 莸č°į¨åĒč¯ģ APIīŧQuery/Get/List įīŧã åĻéč°į¨åæäŊ APIīŧč¯ˇčŽžįŊŽį¯åĸåé ZSTACK_ALLOW_ALL_API=true
Args: api_name: API åį§°īŧåĻ "QueryVmInstance" parameters: API åæ°åå ¸ 寚äē Query APIīŧconditions æ ŧåŧä¸ē: [{"name": "åæŽĩå", "op": "æäŊįŦĻ", "value": "åŧ"}, ...] åéĄĩ: limitīŧéģ莤 50īŧãstartīŧåį§ģéīŧ åæŽĩéæŠ: fieldsīŧåå°čŋåæ°æŽéīŧ
Returns: API æ§čĄįģæ (JSON æ ŧåŧ)
Example: execute_api( api_name="QueryVmInstance", parameters={ "conditions": [ {"name": "uuid", "op": "like", "value": "ae6e57a0%"} ] } )
| Name | Required | Description | Default |
|---|---|---|---|
| api_name | Yes | ||
| parameters | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the critical safety trait that only read-only APIs are allowed by default and that write operations require an explicit environment variable. It also states the return format (JSON) and documents pagination/field-selection behavior, which goes beyond the sparse schema. It could add error behavior or mutation warnings, but the key behavioral constraints are covered.
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 well-structured with a short purpose, a critical safety note, clearly labeled Args, Returns, and Example sections. Every part adds value: the read-only guard is front-loaded, the conditions format is essential, and the example demonstrates realistic usage. There is no fluff or repetition.
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?
For a generic executor with an open-ended parameters object and no annotations, the description provides the essential information: how to name an API, how to format query conditions, pagination/field controls, and the default write restriction. It is slightly incomplete regarding non-query API parameter conventions and possible error behaviors, but the example and Query API details make it sufficiently complete for common 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 description coverage is 0%, so the description must compensate. It does so by explaining api_name with an example and by detailing the parameters dict, including the conditions array format, default limit, offset, and fields selection. This adds substantial meaning beyond the bare schema. It does not document parameter formats for write APIs, but the generic nature of the tool makes exhaustive documentation impractical.
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 identifies the action ('æ§čĄ ZStack API' / execute ZStack API) and the target resource (ZStack API), with a concrete example (QueryVmInstance). It does not explicitly contrast itself with siblings like search_api or describe_api, so it misses the top tier for sibling differentiation, but the intended purpose is unambiguous.
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 gives clear operational guidance: read-only APIs are allowed by default, and write APIs require setting ZSTACK_ALLOW_ALL_API=true. It also explains Query API conditions and pagination defaults, which helps an agent use the tool correctly. However, it does not explicitly state when this tool should be used instead of sibling tools, nor when to avoid it, leaving usage context mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metric_dataA
čˇå ZStack įæ§æ°æŽ
Args: namespace: åŊåįŠēé´īŧåĻ "ZStack/VM", "ZStack/Host" metric_name: ææ åį§°īŧåĻ "CPUUsedUtilization" start_time: åŧå§æļé´īŧISO æį§įē§æļé´æŗīŧ end_time: įģææļé´īŧISO æį§įē§æļé´æŗīŧ period: éæ ˇå¨æ(į§)īŧéģ莤 60 labels: æ įžčŋæģ¤īŧåĻ ["VMUuid=xxx"] æ {"VMUuid":"xxx"} summary_only: äģ čŋåįģ莥äŋĄæ¯īŧįšæ°/æå¤§/æå°/åšŗå/æšåˇŽ/æ ååˇŽīŧ
æŗ¨æ: čŋåæ°æŽé䏿ļé´čˇ¨åēĻå period ææŖæ¯ãå¯į¨äŧ°įŽå Ŧåŧ: įšæ° â ceil((end_time - start_time) / period) * series_count series_count ä¸ēä¸å label įģåæ°éīŧčĨä¸äŧ labelsīŧå¯čŊčŋåå¤įģįŗģå īŧäžåĻææ å åĢ CPUNum/VMUuid į label æļæ¯ä¸ĒįģåéŊäŧäē§åēä¸įģåēåīŧã ä¸ēéŋå čžåēčŋ大īŧįŧŠįæļé´čå´ãåĸ大 period æåĸå labels čŋæģ¤ã
Returns: įæ§æ°æŽįšå襨
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | ||
| period | No | ||
| end_time | No | ||
| namespace | Yes | ||
| start_time | No | ||
| metric_name | Yes | ||
| summary_only | 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 behavioral burden. It discloses output-size scaling with a formula, explains multi-series behavior when labels are omitted, and gives practical warnings for avoiding overly large responses. It does not cover auth, timeout, or error behavior, but for a read-only metric query it is fairly transparent.
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 structure is clear and purposeful: a one-line purpose, an Args section covering all parameters, and a valuable note about output size. The length is justified for a 7-parameter tool with no schema descriptions, though the Returns section adds little beyond what an output schema would already provide.
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?
For 7 parameters, no annotations, and an output schema present, the description covers the essential call semantics, data-volume behavior, and return type. Remaining gaps are minor: behavior when start_time/end_time are omitted, and the exact effect of summary_only on the returned structure.
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 completely by explaining every parameter with examples, units, defaults, and format notes. It also clarifies labels and summary_only semantics beyond the schema, and the volume formula gives practical meaning to start_time, end_time, and period.
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 opens with 'čˇå ZStack įæ§æ°æŽ' (get ZStack monitoring data), naming a clear verb and resource. It does not explicitly contrast with siblings like get_metric_summary or search_metric, so differentiation is inferred from names rather than stated.
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 given on when to use this tool versus alternatives such as get_metric_summary or search_metric. The description focuses on how to use parameters and warns about output size, but it never states when this tool is the right choice or when to prefer a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metric_summaryB
čˇåįæ§ææ įčå TopNīŧæ label_key åįģīŧ
Args: namespace: åŊåįŠēé´īŧåĻ "ZStack/VM", "ZStack/Host" metric_name: ææ åį§°īŧåĻ "CPUOccupiedByVm" label_key: æ įžéŽīŧåĻ "VMUuid", "HostUuid" metric_names: å¯éīŧ夿æ ååšļīŧåĻ in/outīŧ start_time: åŧå§æļé´īŧISO æį§įē§æļé´æŗīŧ end_time: įģææļé´īŧISO æį§įē§æļé´æŗīŧ period: éæ ˇå¨æ(į§)īŧéģ莤 60 aggregate: åææ čåæšåŧīŧå¯é "max"|"avg"|"sum"|"min" combine: 夿æ ååšļæšåŧīŧå¯é "sum"|"avg"|"max"|"min" threshold_op: éåŧæ¯čžįŦĻīŧåĻ >,>=,<,<=,==,!= threshold_value: éåŧæ°åŧ top_n: čŋåæĄæ°īŧéģ莤 10 resolve_resource: å¯é "vm" æ "host"īŧį¨äēč§Ŗæåį§°
Returns: čååį TopN å襨
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| period | No | ||
| combine | No | sum | |
| end_time | No | ||
| aggregate | No | max | |
| label_key | Yes | ||
| namespace | Yes | ||
| start_time | No | ||
| metric_name | Yes | ||
| metric_names | No | ||
| threshold_op | No | ||
| threshold_value | No | ||
| resolve_resource | 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 provided, the description carries the full burden of behavioral disclosure. It states that it retrieves aggregated TopN values, but does not say whether the call is read-only, what happens when start_time/end_time are omitted, whether threshold filtering is applied before or after aggregation, or how pagination/limits behave.
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 structure is compact and effective: a precise summary line, a well-organized Args list, and a short Returns line. Every entry earns its place, and the parameter list is scannable. It loses one point because the Returns section is extremely terse, though an output schema exists to fill that gap.
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 complexity (13 parameters, no annotations, 0% schema coverage), the description covers parameter semantics well but leaves critical contextual gaps: when to use it versus sibling tools, whether time ranges are required, and how the TopN grouping behaves. It is a usable but incomplete definition.
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 compensate. It does so thoroughly: every one of the 13 parameters gets context, including concrete examples for namespace and metric_name, allowed values for aggregate and combine, format guidance for time parameters, and defaults for period and top_n. This is exactly the kind of compensation needed.
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 one-line summary states a specific verb and resource: fetch aggregated TopN metric values grouped by a label_key. It is clear about the operation, but it does not explicitly differentiate itself from siblings like get_metric_data or search_metric; it relies on the phrase 'aggregated TopN' to imply the distinction.
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 gives no guidance on when to prefer this tool over alternatives such as get_metric_data or search_metric. It lists parameters and return type, but never states the conditions, prerequisites, or scenarios for which this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_apiA
æ šæŽå ŗéŽč¯æį´ĸ ZStack API
Args: keywords: æį´ĸå ŗéŽč¯å襨īŧåĻ ["Query", "Vm"] æ ["Create", "Volume"] æ¯æéŠŧåŗ°æååšé īŧåĻæį´ĸ "vm" å¯äģĨåšé "QueryVmInstance" category: å¯éīŧæåįąģčŋæģ¤īŧåĻ "vm", "volume", "network" limit: æå¤čŋåæ°éīŧéģ莤 15
Returns: åšé į API å襨īŧå åĢåį§°ãæčŋ°ãåįąģãč°į¨įąģå
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| category | No | ||
| keywords | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and largely meets it: it reveals the camelCase-splitting matching mode, optional category filtering, and the default cap of 15 results. It does not cover edge cases like empty results or case sensitivity, but for a read-only search tool the core behavioral traits are disclosed.
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 consists of one front-loaded purpose line followed by compact Args and Returns sections. Every clause earns its place, and there is no repetition of schema structure, boilerplate, or redundant phrasing.
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?
For a 3-parameter search tool with an output schema, this is nearly complete: it covers purpose, matching behavior, all parameters, defaults, and return content. The only notable omissions are explicit sibling routing and edge-case behavior, which are minor at this complexity level.
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% â the input schema contains only titles and types. The Args section fully compensates by defining keywords as a list with camelCase matching, category as an optional filter, and limit as a max-return-count defaulting to 15, adding operational meaning the schema itself lacks.
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 'æ šæŽå ŗéŽč¯æį´ĸ ZStack API' names a specific verb (search) and resource (ZStack API), and the Returns section clarifies that it yields API metadata (name, description, category, call type) rather than executing calls. This clearly differentiates it from siblings like execute_api and search_metric, whose targets are different.
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 a concrete matching-behavior example ('vm' matches 'QueryVmInstance' via camelCase splitting), which helps an agent phrase queries effectively. However, it does not explicitly state when to prefer this tool over describe_api/execute_api or when to use search_metric instead; routing is left implied by sibling names rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_metricA
æį´ĸå¯į¨į ZStack įæ§ææ
Args: keywords: æį´ĸå ŗéŽč¯īŧåĻ ["CPU", "Usage"] æ ["Memory"] æ¯æéŠŧåŗ°æååšé namespace: å¯éīŧæåŊåįŠēé´čŋæģ¤īŧæ¯ææ¨Ąįŗåšé īŧīŧåĻ "ZStack/VM", "vm", "host" limit: æå¤čŋåæ°éīŧéģ莤 20 match_mode: å ŗéŽč¯åšé æ¨Ąåŧīŧ"and" æ "or"īŧéģ莤 "or" prefer_namespaces: äŧå æåēįåŊåįŠēé´å襨īŧéģ莤 ["ZStack/VM","ZStack/Host"]īŧ
Returns: åšé įįæ§ææ å襨īŧå åĢåį§°ãæčŋ°ãåŊåįŠēé´ãå¯į¨æ įž
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| keywords | Yes | ||
| namespace | No | ||
| match_mode | No | or | |
| prefer_namespaces | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full behavioral burden. It discloses non-obvious behaviors: camel-case keyword splitting, fuzzy namespace matching, match_mode AND/OR logic, and prefer_namespaces sorting. These details give an agent a realistic model of how search results are filtered and ranked.
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 text is front-loaded with the core purpose, then organized under Args and Returns headings. Each line provides necessary operational detail (examples, defaults) without excessive fluff, making the definition scannable and efficient for an LLM to consume.
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?
Although an output schema exists, the description still summarizes return contents (name, description, namespace, available labels) and fully documents all five parameters, defaults, and matching/sorting behaviors. With no annotations and no schema-level descriptions, nothing essential is missing for correct invocation.
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 compensates completely. Every parameterâkeywords, namespace, limit, match_mode, prefer_namespacesâhas a format explanation, examples, and defaults. For instance, keywords is shown with ['CPU', 'Usage'] and the camel-case splitting rule, and match_mode explicitly defines 'and'/'or' and the default.
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 opens with a specific statement: 'æį´ĸå¯į¨į ZStack įæ§ææ ' (search available ZStack monitoring metrics). It clearly identifies a search operation over a distinct resource (monitoring metrics), separating it from sibling tools like search_api or get_metric_data.
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?
Usage is implied through the name and purposeâsearching available metrics before fetching dataâbut no explicit guidance is provided about when to choose this tool over siblings such as get_metric_data or get_metric_summary. There are no when-not or alternative conditions, leaving an agent to infer the positioning.
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.6- First observed
describe_api - First observed
execute_api - First observed
get_metric_data - First observed
get_metric_summary - First observed
search_api - First observed
search_metric
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: search_api/describe_api/execute_api form an API discovery-to-execution pipeline, while search_metric/get_metric_data/get_metric_summary form a metrics retrieval pipeline. Even the two 'search' tools are unambiguously separated by their targets (APIs vs metrics).
All tool names follow a consistent verb_noun snake_case pattern: search_, describe_, execute_, get_. The repetition of 'search' and 'get' is intentional and predictable, with the noun disambiguating the target.
Six tools is a well-scoped count for a server focused on two complementary workflows: API introspection/execution and metric querying. Each tool earns its place without redundancy or bloat.
The API workflow is complete with search, describe, and execute, covering discovery through invocation. The metrics workflow is also complete with search, raw data retrieval, and aggregated summary, with no obvious dead ends or missing operations.
Maintenance
Related MCP Connectors
Deploy, monitor, and manage your OpenClaw AI assistants via natural language.
Query OneLens cloud-cost data in natural language: breakdowns, trends, cost centers. Read-only.
Interact with the Stitch API using natural language commands.
Query your org's data in natural language â read-only MCP access to SQL, NoSQL, files & warehouses.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables AI assistants to manage multi-cloud resources (AWS, Azure, GCP) including resource operations, cost analysis, monitoring metrics, and security compliance checks through natural language commands.2610 npm2MIT
- FlicenseNot gradedqualityDmaintenanceEnables comprehensive management of CloudStack infrastructure through natural language, providing access to over 735 API methods for virtual machines, networking, and storage. It features enterprise-grade security with a safety confirmation system for destructive operations and extensive API coverage.-

PlugLayer MCP Serverofficial
AlicenseCqualityBmaintenanceEnables deploying and managing infrastructure via natural language, including project/domain management, compute nodes, image deployment, and CI/CD integration.70MIT
ZStack MCP Serverofficial
AlicenseAqualityDmaintenanceEnables AI to dynamically search, describe, and execute 2000+ ZStack Cloud APIs, plus query monitoring metrics and data.611MIT