Skip to main content
Glama
aveq-research

Surfmeter MCP Server

Official

Surfmeter MCP Server

A Model Context Protocol server for the AVEQ Surfmeter management API. It exposes typed tools for clients, measurements, anomalies, groups, ISPs, users, keys, capabilities, settings, license usage, and the built-in AI assistant.

Requirements

  • Node.js 20 or newer

  • A Surfmeter management API key beginning with client_admin-

  • A reachable Surfmeter server

Related MCP server: ConnectWise API Gateway MCP Server

Installation

Install the MCP server globally:

pnpm add --global @aveq-research/surfmeter-mcp

Configuration

The server requires two environment variables:

  • API_ENDPOINT: Either the Surfmeter server origin, such as https://surfmeter-server.demo-analytics.aveq.info, or the complete management endpoint, such as https://surfmeter-server.demo-analytics.aveq.info/client_admin_api/v1.

  • API_KEY: A Surfmeter management API key. It is sent in the X-API-KEY request header.

  • API_TIMEOUT_MS: Optional request timeout in milliseconds. The default is 30000.

Do not put a real key in source control. .env is ignored, but MCP clients should normally inject the values through their server configuration.

MCP client configuration

Configure your MCP client to launch the installed surfmeter-mcp executable:

{
  "mcpServers": {
    "surfmeter": {
      "command": "surfmeter-mcp",
      "env": {
        "API_ENDPOINT": "https://surfmeter-server.demo-analytics.aveq.info",
        "API_KEY": "client_admin-replace-me"
      }
    }
  }
}

Tool surface

The server advertises ten tools. Five common operations are promoted directly:

  • surfmeter_get_clients: list a bounded page of clients or get one client

  • surfmeter_update_client: update client labels, tags, or groups

  • surfmeter_search_measurements: query and aggregate measurements

  • surfmeter_search_anomalies: query and aggregate anomaly episodes

  • surfmeter_get_system_status: read server metadata, license usage, fleet health, client status history, detection thresholds, or AI status

The complete management API remains available through a searchable internal action catalog:

  • surfmeter_search_actions: find operations from a natural-language intent

  • surfmeter_describe_action: retrieve one operation's exact parameter schema

  • surfmeter_execute_read_action: execute discovered read-only operations

  • surfmeter_execute_write_action: execute discovered non-destructive mutations

  • surfmeter_execute_destructive_action: execute deletes, revocations, merges, and client disabling

For example:

{
  "query": "create a registration key",
  "category": "write"
}

The result identifies the action, its parameter names, and the correct executor. Use surfmeter_describe_action when the exact schema is needed, then pass the selected action to that executor:

{
  "action_id": "surfmeter_create_registration_key",
  "params": {
    "comment": "Video probes",
    "capability_id": 12
  }
}

The server validates params against the selected action's internal Zod schema. It rejects action/executor category mismatches. Read, write, and destructive executors have separate MCP annotations so compatible hosts can apply the correct confirmation behavior.

The internal catalog covers clients, notification preferences, fleet and system health, groups, ISP contracts, ISPs, users, API keys, registration keys, capabilities, measurements and supplementary reports, anomalies, tuning overrides, settings, detection thresholds, license usage, and Surfmeter's built-in AI assistant.

Client list responses default to 20 records and accept offset and limit (maximum 25). They include total, returned, has_more, and next_offset under pagination. Pass next_offset as the next call's offset; a null value marks the final page. Single-client lookup with id is unchanged.

Fleet-health responses use the same bounded pagination and can be filtered by healthy, warning, critical, or unknown state. Per-client system-status history defaults to 20 records and accepts a maximum of 100, with optional start_time and end_time filters.

Magic-link and session endpoints are intentionally not exposed. They are browser authentication mechanisms and are neither needed nor appropriate when the MCP server already authenticates with a management API key.

Elasticsearch searches

surfmeter_search_measurements and surfmeter_search_anomalies accept Elasticsearch Query DSL under body.

Measurement searches also accept index_scope with web, video, network, speedtest, conferencing, or gaming to avoid searching unrelated index families.

Supplementary P.1203, web network-performance, and Lightweight Video Player reports use the parent measurement's numeric id field. Do not pass the subtype fields such as video_measurement_id or web_measurement_id.

Use .keyword for exact matching, aggregations, and sorting on text fields:

{
  "body": {
    "size": 0,
    "query": {
      "term": {
        "type.keyword": "VideoMeasurement"
      }
    },
    "aggs": {
      "by_client": {
        "terms": {
          "field": "client_label.keyword"
        }
      }
    }
  }
}

The server parses normal JSON and Elasticsearch NDJSON scroll responses. Prefer server-side filtering and aggregation to downloading and filtering large datasets in the agent.

Agent skill

The companion Surfmeter skills repository teaches compatible coding agents how to invoke the API directly, and how to construct Elasticsearch requests. Skills are orthogonal to MCP servers. You may choose to not load an MCP server's heavy tool definition in all sessions; skills are a good, lightweight alternative to that.

Development

See DEVELOPERS.md for contributor setup, build instructions, implementation notes, and testing.

Available Tools

10 tools
surfmeter_describe_actionA
Read-onlyIdempotent

Get the exact schema, safety category, and required executor for one discovered Surfmeter action.

ParametersJSON Schema
NameRequiredDescriptionDefault
action_idYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate safety. The description adds that the tool returns schema, safety category, and executor, but this is more about output content than behavioral traits. No contradiction exists between description and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly worded sentence with no filler or redundancy. The key outcome is front-loaded, and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter metadata lookup, the description plus annotations cover the essential context: it is a safe, read-only, idempotent operation returning specific details. The description does not explicitly say the action will not be executed, but the readOnlyHint and the focus on metadata make that clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the schema only says action_id is a non-empty string. The description compensates by explaining that action_id identifies 'one discovered Surfmeter action,' which adds meaning beyond the raw parameter name and type. It does not specify format or source, but for a single opaque identifier this is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get'), a clear resource (one discovered Surfmeter action), and the exact information returned: schema, safety category, and required executor. This clearly distinguishes it from siblings like search_actions (discovery) and execute_* tools (execution).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'one discovered Surfmeter action' establishes that this tool is for actions already found, implying a workflow of discover-then-describe-before-execute. It does not explicitly name alternatives or exclusions, but the intended usage context is clear from the wording.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_execute_destructive_actionA
Destructive

Execute a destructive Surfmeter action returned by surfmeter_search_actions. Confirm exact targets and consequences first.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
action_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is covered. The description adds the crucial confirmation requirement and specifies the source of the action, going beyond what annotations state. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero redundancy. It states the purpose, the source, and the critical warning efficiently. Perfectly concise for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema and a nested params object, the description lacks essential context: what to put in params, how to identify the correct action_id, and what the return value looks like. The warning to confirm targets is good, but the lack of parameter explanation makes the tool incomplete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 only implies action_id comes from search_actions but does not clarify its format or the purpose of the params object (nested, with arbitrary properties). This leaves the agent guessing about how to fill params and what action_id looks like.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('execute') and resource ('destructive Surfmeter action') and explicitly ties the action to surfmeter_search_actions, distinguishing it from read/write sibling tools. It's unambiguous about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear guidance to confirm targets and consequences before execution, which is essential for a destructive action. It also indicates the action must come from surfmeter_search_actions, implying the correct prior step. It doesn't explicitly list alternatives, but the 'destructive' qualifier and sibling names make the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_execute_read_actionA
Read-onlyIdempotent

Execute a read-only Surfmeter action returned by surfmeter_search_actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
action_idYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the description's read-only framing adds little safety information beyond structured data. It does add a useful provenance constraint: the action must come from surfmeter_search_actions, which is the main behavioral value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the core purpose and usefully names the source tool without wasting words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an execute tool with an unrestricted params object, no output schema, and no parameter documentation, this description is too thin. An agent does not know how to construct params, whether to call surfmeter_describe_action first, or what the response will contain. The pipeline hint helps but leaves essential execution details unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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, but it only gives indirect context for action_id by mentioning the action comes from a search. It does not explain the required action_id format or the params object semantics, which are entirely unconstrained in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Execute') and resource ('read-only Surfmeter action'), and explicitly ties the action to the output of surfmeter_search_actions. This clearly differentiates it from the write and destructive execution siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'returned by surfmeter_search_actions' provides clear usage context and implies this tool should be called after a search. It does not explicitly state exclusions or alternatives, but the read-only qualifier plus sibling names make the intended scope reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_execute_write_actionB

Execute a non-destructive Surfmeter mutation returned by surfmeter_search_actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
action_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false. The description adds the 'non-destructive' qualifier, which aligns with destructiveHint=false and adds context that this is a mutation but not destructive. However, it doesn't disclose what the mutation does, what side effects occur, or what the response contains. The description doesn't contradict annotations, but it doesn't add much beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is concise and front-loads the key information: it executes a mutation, it is non-destructive, and it comes from surfmeter_search_actions. It earns its place, though it could add a bit more detail without becoming bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, no parameter documentation, and annotations that only cover safety hints, the description is too thin. An agent needs to know what action_id refers to, what params should contain, and what the result of executing a mutation looks like. The reference to surfmeter_search_actions helps but doesn't fully compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 for the two parameters. It only mentions action_id implicitly by saying 'mutation returned by surfmeter_search_actions', but it doesn't explain that action_id is the identifier of that mutation, nor does it explain the purpose of the 'params' object. The description adds almost no parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Execute') and resource ('non-destructive Surfmeter mutation'), and references the sibling tool surfmeter_search_actions as the source of the mutation. It clearly distinguishes itself from surfmeter_execute_read_action and surfmeter_execute_destructive_action by the 'non-destructive' qualifier, though it doesn't explicitly name those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says the mutation must be 'returned by surfmeter_search_actions', which gives a clear prerequisite and workflow context. It doesn't explicitly state when not to use it or name alternatives, but the 'non-destructive' qualifier and the sibling set make the usage context reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_get_clientsA
Read-onlyIdempotent

Get one Surfmeter client when id is supplied, or list a bounded page of visible clients. List responses include total and next_offset pagination metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRails numeric ID or UUID, where the endpoint supports UUIDs
limitNo
offsetNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it returns a bounded page, includes total and next_offset pagination metadata, and only shows 'visible' clients. This goes beyond the annotations and helps the agent understand response shape and scoping.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The primary behavior (get by id or list) is front-loaded, and the pagination metadata note is a valuable addition. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list/get tool with strong annotations and a clear description, this is nearly complete. The only minor gap is that it doesn't explicitly state what 'visible' means (e.g., permission-scoped clients), but that is a domain nuance rather than a critical omission. No output schema exists, so the description's mention of total and next_offset is helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only 'id' has a description). The description clarifies that 'id' is optional and switches between single-get and list mode, and that limit/offset control pagination. However, it doesn't add detail about limit bounds or offset semantics beyond what the schema already provides. Baseline 3 is appropriate because the description partially compensates for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Get') and resource ('Surfmeter client'), and explicitly distinguishes the two modes: single client by id vs. bounded page of visible clients. It also mentions pagination metadata, which helps differentiate it from sibling search tools like surfmeter_search_anomalies or surfmeter_search_measurements.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: supply an id for a single client, or omit it to list a page. It does not explicitly name alternatives or exclusions, but the sibling list makes the distinction clear enough. A small gap is that it doesn't say when to prefer surfmeter_search_* tools over this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_get_system_statusB
Read-onlyIdempotent

Read server metadata, license usage, fleet health, one client's status history, detection thresholds, or Surfmeter AI status.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
stateNo
offsetNo
end_timeNo
extendedNo
resourceYes
client_idNo
start_timeNo
registration_key_idNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds no additional behavioral traits beyond 'Read', which aligns with annotations. It does not describe response format or pagination, but annotations cover the safety aspects, so a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the verb 'Read' and lists the resources. It is appropriately sized and efficient, though it could benefit from a more structured breakdown of resource options. Overall, it is concise and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity with 9 parameters and multiple resource types, the description is incomplete. It lacks guidance on parameter combinations, expected responses, and how to filter results. The absence of an output schema increases the need for description clarity, which is not met. An agent would struggle to construct correct calls without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 not explain any of the 9 parameters, including the required 'resource' field or the optional filters like limit, offset, state, and extended. The enum for resource is helpful but not elaborated. The description's list of resources implies the resource parameter but does not connect parameters to behavior, leaving agents to infer semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies this as a read operation ('Read') and lists the specific data categories (server metadata, license usage, fleet health, etc.). It distinguishes from sibling tools like surfmeter_search_* and surfmeter_update_client, which serve different purposes. However, it does not explicitly mention the required 'resource' parameter, leaving some ambiguity about how to select among the listed options.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool vs alternatives. While it is obviously the tool for reading system status, there is no mention of alternatives or conditions that would route an agent away from it. The resource enum in the schema offers some context, but the description itself lacks routing information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_search_actionsA
Read-onlyIdempotent

Find less-common Surfmeter operations by intent. Returns action IDs, safety categories, executors, and parameter names. Use surfmeter_describe_action for the exact schema.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
categoryNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about what is returned (action IDs, safety categories, executors, parameter names) but does not disclose behaviors such as how results are ordered, whether queries are fuzzy/exact, or any limits beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The primary purpose is front-loaded, the return payload is summarized, and the pointer to describe_action is a single useful clause. Every word contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with no output schema, the description covers the main inputs by intent, lists return fields, and provides a natural next step. It could be slightly stronger by explaining the category enum or how to use the returned action IDs, but it is largely sufficient for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 for documenting the parameters. It vaguely implies 'query' is an intent expression and mentions 'parameter names' as an output, but it fails to explain the meaning of 'query', 'category', or 'limit' beyond what the raw schema already shows. This leaves a significant semantic gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Find'), identifies the resource ('less-common Surfmeter operations'), and states the search is by intent. It also lists the concrete outputs (action IDs, safety categories, executors, parameter names) and clearly separates itself from surfmeter_describe_action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: searching for less-common operations by intent. It also explicitly routes the agent to surfmeter_describe_action for exact schemas. It does not, however, distinguish this from other search siblings like surfmeter_search_anomalies or surfmeter_search_measurements, or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_search_anomaliesB
Read-onlyIdempotent

Search and aggregate anomaly episode documents with Elasticsearch Query DSL. Use .keyword for exact text fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesElasticsearch Query DSL object (preferred) or JSON string. Use .keyword for exact text matching.
fromNo
sizeNo
source_onlyNo
search_afterNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds that the operation can aggregate results via Elasticsearch Query DSL, which is useful, but it does not disclose pagination behavior, result shape, or other operational caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the core purpose in the first sentence. The second sentence is a useful practical tip, though it partially duplicates the body parameter description in the schema. Overall, there is no wasteful filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and five parameters, the description is too sparse. It does not explain how from, size, search_after, or source_only shape behavior, nor does it describe the return structure. An agent would need external Elasticsearch knowledge to use the tool confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one of five parameters (body) has any description, and the tool description mostly repeats the schema's body description by mentioning .keyword. The from, size, source_only, and search_after parameters are left undocumented in both the schema and the description, and the low 20% coverage is not compensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Search and aggregate') and a distinct resource ('anomaly episode documents'), which clearly sets it apart from siblings like surfmeter_search_measurements and surfmeter_search_actions. An agent can identify when this tool is relevant without needing to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for anomaly episode documents, and offers a concrete tip about using .keyword for exact text fields. However, it does not explicitly state when to prefer this tool over sibling search tools, nor does it mention any alternative or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_search_measurementsA
Read-onlyIdempotent

Search and aggregate measurement documents with Elasticsearch Query DSL. Prefer filters and aggregations server-side; use .keyword for exact text fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesElasticsearch Query DSL object (preferred) or JSON string. Use .keyword for exact text matching.
fromNo
sizeNo
scrollNoOptional Elasticsearch scroll timeout such as 1m
index_scopeNoLimit the search to one measurement index family
source_onlyNo
search_afterNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false, which already signal a safe, read-only, open-world operation. The description adds guidance on server-side filtering and .keyword usage, which is useful but not deeply behavioral. It doesn't disclose aspects like performance implications, use of scroll for large result sets, or how it handles indexing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences, front-loaded with the primary purpose and then key usage tips. Every word adds value, and it avoids redundancy with the schema. The structure is clear and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (Elasticsearch DSL) and a moderate parameter count (7), the description covers the core usage pattern (server-side filtering, .keyword) but is missing details like examples of common queries, explanation of scroll for large results, or how 'index_scope' restricts the family. However, the schema provides some descriptions for several params, partially compensating. The lack of output schema is acceptable as the description needn't explain returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 43%, so the description must compensate for the 4 parameters potentially lacking schema descriptions. The description adds semantic guidance on the 'body' parameter (prefer object, use .keyword) which goes beyond the schema. It could detail the 'from'/'size' pagination semantics, but the .keyword hint is significant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool is for searching and aggregating measurement documents using Elasticsearch Query DSL. It specifies the primary resource (measurement documents) and the action (search and aggregate). However, it doesn't explicitly distinguish from siblings like surfmeter_search_anomalies or surfmeter_search_actions, though the resource type is implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on how to use the tool: prefer server-side filters/aggregations and use .keyword for exact text matching. It implies usage context for Elasticsearch querying but does not explicitly contrast with sibling tools or state when NOT to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surfmeter_update_clientA

Update an owned client's labels, tags, or client-group assignments. Shared clients are read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRails numeric ID or UUID, where the endpoint supports UUIDs
tagsNo
labelNo
extra_labelNo
client_group_idsNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-destructive, non-idempotent operation. The description adds the ownership constraint (shared clients are read-only) and the list of updatable fields, but doesn't disclose side effects, permission requirements, or response behavior. It adds some context beyond annotations but not rich detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the action and resource, followed by the ownership constraint. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core purpose and the critical ownership constraint, but lacks details on response format, error handling, parameter semantics, and potential side effects. For a write tool with 5 parameters and no output schema, more context would be beneficial, though the annotations and sibling context partially fill gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20% (only 'id' has a description). The description mentions 'labels, tags, or client-group assignments' but doesn't map these explicitly to the schema's 'tags', 'label', 'extra_label', and 'client_group_ids', nor explain their meaning or format. It provides only a high-level field list, insufficient to compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an owned client's labels, tags, or client-group assignments, providing a specific verb and resource. It distinguishes from sibling read/search tools by explicitly framing this as an update operation, and the ownership constraint further differentiates it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage condition: only owned clients can be updated, and shared clients are read-only. This implicitly tells the agent when to use this tool, though it doesn't explicitly name alternative tools or state when NOT to use it beyond the shared-client restriction.

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.

  1. 10 tool updatesv0.2.1
    • First observedsurfmeter_describe_action
    • First observedsurfmeter_execute_destructive_action
    • First observedsurfmeter_execute_read_action
    • First observedsurfmeter_execute_write_action
    • First observedsurfmeter_get_clients
    • First observedsurfmeter_get_system_status
    • First observedsurfmeter_search_actions
    • First observedsurfmeter_search_anomalies
    • First observedsurfmeter_search_measurements
    • First observedsurfmeter_update_client

TDQS

A3.8/5.0

Scored across 10 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but get_system_status bundles multiple concerns (server metadata, client status history, thresholds, AI status) and could be confused with get_clients for status-related queries. The two search tools are structurally similar as well, though their target document types are clear.

Naming Consistency5/5

All tools follow a consistent surfmeter_<verb>_<object> pattern with snake_case throughout. The progression from search_actions → describe_action → execute_*_action is predictable and logical.

Tool Count5/5

Ten tools is well-scoped for this domain: direct client/measurement/anomaly/status access plus a generic action discovery and execution workflow. Each tool serves a distinct role without unnecessary bloat.

Completeness4/5

The dynamic action system fills coverage gaps for less-common operations, making the surface quite capable. However, direct client lifecycle management is incomplete (get and update only, no create/delete), and measurements/anomalies are only accessible via search rather than direct retrieval.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server that provides programmatic access to the Supabase Management API. This server allows AI models and other clients to manage Supabase projects and organizations through a standardized interface.
    8
    40 npm
    52
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that provides a comprehensive interface for interacting with the ConnectWise Manage API, simplifying API discovery, execution, and management for both developers and AI assistants.
    2 npm
    18
    -
  • A
    license
    A
    quality
    D
    maintenance
    A Model Context Protocol server that enables AI assistants to make HTTP requests (GET, POST, PUT, DELETE) to external APIs through standardized MCP tools.
    4
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Model Context Protocol server for full Hetzner Cloud + Storage API automation. Exposes all official Hetzner operations as MCP tools so AI agents can manage servers, networking, load balancers, firewalls, volumes, DNS zones, and storage boxes from one server.
    1
    MIT