Opservo
Server Details
Read-only server insight: why a Linux server or K8s cluster is slow, failing or changed.
- Status
- Healthy
- Uptime
- 92.7% over 26 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- Opservo
TDQS
Scored across 9 tools
Each tool targets a distinct resource or view: server metrics (get_server_overview), services (get_services), logs (get_log_summary), domains/SSL (get_domains), commands (get_recent_commands), monitoring context (get_incident_timeline, get_recommendations), Kubernetes (get_kubernetes_snapshot), and workspace inventory (list_agents). The only mild proximity is between get_incident_timeline and get_recommendations, but their descriptions clearly differentiate temporal correlation from a ranked issue list.
Eight of nine tools follow a clean get_<noun> snake_case pattern, with list_agents using the conventional list_verb for a collection endpoint. The naming is predictable and readable throughout.
Nine tools is well-scoped for an observability/ops monitoring server, with each tool covering a distinct facet of the domain and none feeling redundant or filler.
The read-only diagnostic surface is broad, covering servers, Kubernetes, logs, services, SSL, commands, and detected issues. Minor gaps remain: no action/execution tools (restart, run fix, apply recommendation), no arbitrary time-range or historical metric queries, and no way to drill into a specific detected issue.
Available Tools
9 toolsget_domainsDomains and SSL expiryARead-onlyIdempotentInspect
Returns the domains served by one server's web server configuration and the number of days until each SSL certificate expires.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| domains | No | Domains from the nginx/Apache configuration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds the scoping constraint that results come only from the web server configuration (so non-web servers may yield nothing), which is modest added value but no detail on permissions, rate limits, or result shape.
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?
A single sentence with zero filler, front-loading both the resource (domains) and the secondary payload (SSL expiry days). Nothing is wasted and nothing important is buried.
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 one-parameter read tool with full annotation coverage and an output schema that already documents the return shape, the description supplies enough to call it correctly. The only shortfall is the absence of any routing guidance among the many sibling read tools.
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 100% for the single agent_id parameter, so the baseline is 3. The description's 'one server' wording corroborates the schema's 'server/agent UUID' semantics but adds no additional format or constraint detail.
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?
Specific verb ('Returns') plus a precisely bounded resource: the domains in one server's web server configuration and each certificate's days-to-expiry. That resource is inherently distinct from siblings like get_services, get_server_overview, or get_log_summary, so an agent can route without opening any schema.
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 phrase 'one server's web server configuration' implies the per-agent query model, but there is no explicit when-to-use, no when-not-to-use, and no mention of any alternative tool despite eight siblings. The agent is left to infer that this is the domain/SSL-specific view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_incident_timelineIncident timelineBRead-onlyIdempotentInspect
Returns a time-ordered list of correlated events on one server over a look-back window — service crashes, error and warning spikes in the logs, CPU/memory/disk thresholds crossed, SSL certificates nearing expiry, and newly detected issues — with the likely root cause when one is identified.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Look-back window in hours, 1 to 720 (default 4). | |
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| events | No | Correlated events, oldest first. |
| root_cause | No | The event the others are attributed to, or null. |
| window_end | No | End of the look-back window, ISO 8601. |
| window_start | No | Start of the look-back window, ISO 8601. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, non-destructive, and closed-world. The description adds no further behavioral traits such as auth requirements, rate limits, or performance characteristics, but it does provide clarity on the correlated nature of the output. With rich annotations, the bar is lower, and this is adequate.
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, well-structured sentence that front-loads the core action and lists relevant event types without any wasted words. Every element contributes to understanding the tool's scope.
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 presence of an output schema and comprehensive annotations, the description is nearly complete for the tool's purpose. It could be improved by explicitly noting when to use it over related tools, but it is otherwise sufficient 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 100%, and both parameters (agent_id, hours) are fully documented in the schema. The description does not add any parameter meaning, so the baseline of 3 is appropriate.
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 names a specific verb ('Returns') and resource ('time-ordered list of correlated events on one server'), and enumerates the event types it captures. It is clear and detailed, but it does not explicitly distinguish itself from siblings like get_log_summary or get_recommendations.
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, nor any prerequisites or exclusions. The description only states what it returns, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_kubernetes_snapshotKubernetes cluster snapshotARead-onlyIdempotentInspect
Returns the state of one Kubernetes cluster connected to Opservo: version, node conditions and capacity, workloads with ready counts and restarts, problem pods with their reason, last exit code and recent log lines, and recent warning events. Answers only for a cluster (kind kubernetes); a Linux server returns an error saying so.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pods | No | |
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| nodes | No | |
| events | No | Recent warning events. |
| version | No | Kubernetes server version. |
| workloads | No | |
| collected_at | No | When the snapshot was taken, ISO 8601. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior, so the safety profile is covered. The description adds genuinely new behavior: the type-mismatch error path for non-Kubernetes agents and the specific shape of diagnostic data returned (pod reasons, exit codes, recent log lines).
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?
Front-loaded with the core operation, followed by a dense enumeration of returned fields and then the scoping caveat. It is a single long sentence plus a short one; every clause carries information, though the long enumeration borders on verbose.
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?
An output schema exists, so return values are already covered structurally, yet the description still previews the key contents in a useful way. The error-path disclosure closes the main remaining gap for a single-parameter read tool.
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?
With only one parameter at 100% schema coverage, the schema already fully documents agent_id. The description's phrase 'one Kubernetes cluster connected to Opservo' implies the id selects a cluster but adds no syntax or constraints beyond the schema, so the baseline of 3 applies.
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?
States a specific verb and resource ('Returns the state of one Kubernetes cluster') and then enumerates the concrete contents (version, node conditions, workloads, problem pods, warning events). This clearly distinguishes it from siblings like get_server_overview and get_services, so an agent can route without opening other schemas.
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?
Explicitly scopes the tool: 'Answers only for a cluster (kind kubernetes); a Linux server returns an error saying so' tells the agent when this call will succeed versus fail. It does not, however, name the alternative tool to use for Linux servers, leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_log_summaryLog summaryARead-onlyIdempotentInspect
Returns the latest AI-written summary of one server's logs and its five most frequent log patterns from the last hour (nginx, Apache, Laravel, Docker, PM2, systemd), with counts and when each was last seen.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| summary | No | Latest AI-written summary, or null when none has been generated. |
| top_clusters | No | Five most frequent log patterns from the last hour. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower and the description still adds real behavioral context: the data is AI-written, scoped to a one-hour window, limited to five patterns, and covers specific log sources (nginx, Apache, Laravel, Docker, PM2, systemd). It does not mention pagination or freshness/caching, which keeps it from a 5.
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?
It is a single dense sentence, but front-loaded with the core purpose ('Returns the latest AI-written summary of one server's logs') before the pattern-window detail. Every clause carries information, though the trailing parenthetical log-source list and count/timestamp clause make it a run-on that could have been split for readability.
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?
An output schema exists, so return formatting needn't be restated, and the description covers scope (one server), time window (last hour), and volume (five patterns). Since this is a read-only, single-parameter tool, little else is required, though a note on how fresh the AI summary is would complete it.
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 coverage is 100% and the single agent_id parameter is fully documented as 'the server/agent UUID to query'. The description reinforces the one-server scope but adds no format, constraint, or validation detail beyond the schema, so the baseline 3 applies.
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 names a specific verb+resource ('Returns the latest AI-written summary of one server's logs') and enumerates the exact payload: five most frequent log patterns from the last hour, with counts and last-seen timestamps. This is clearly distinguishable from siblings like get_server_overview or get_incident_timeline, which cover different resources.
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 only implied: an agent can infer this is the tool for 'what is happening in a server's logs right now', and the 'last hour' window narrows the intent. However, it never states when to prefer this over get_incident_timeline or get_server_overview, nor any exclusion conditions, so routing must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_commandsRecent commands (history)ARead-onlyIdempotentInspect
Returns the commands recently run on one server through Opservo (terminal, quick actions, approved fixes, automation), sorted newest to oldest, with source, exit code and the start of their output.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max commands to return (1-50, default 20). | |
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| commands | No | Newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the feed aggregates four command sources and is sorted newest to oldest, telling the agent what population and ordering to expect.
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?
A single front-loaded sentence that moves from purpose to scope to ordering to returned fields with no filler. Slightly run-on with the parenthetical source list, but every clause earns its place.
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?
An output schema exists, so the description need not explain return values, and annotations cover the safety profile. Purpose, scope, ordering and cardinality hints are present; the only gap is explicit routing guidance versus sibling history/log tools.
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 100% for both parameters (agent_id UUID, limit 1-50 default 20), so the schema already carries full parameter meaning. The description adds nothing about parameter behavior, and per the baseline for high coverage a 3 is appropriate.
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?
States a specific verb (Returns) and resource (commands recently run on one server), plus the scope of what appears (terminal, quick actions, approved fixes, automation) and ordering. This clearly separates it from siblings like get_log_summary and get_incident_timeline without needing to name 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?
Usage is only implied: an agent can infer this is the tool for command history on a given agent, but there is no explicit when-to-use, when-not-to-use, or pointer to alternatives such as get_log_summary or get_incident_timeline when a different view of activity is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendationsServer issues and recommendationsARead-onlyIdempotentInspect
Returns the open issues Opservo has detected on one server, ranked by severity (critical, warning, info), each with a plain-English description and the suggested fix. Can be filtered to one severity.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The server/agent UUID to query. | |
| severity | No | Optional: only return recommendations at this severity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| recommendations | No | Open issues, critical first. |
TDQS
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 genuine behavioral context beyond that: only *open* issues are returned, results are ordered by severity, and each item carries a plain-English description plus a suggested fix.
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?
One sentence that front-loads the resource, then the ordering, then the filtering. No redundant restatement of the title and nothing an agent must wade through.
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?
An output schema exists, so return-value details need not be spelled out, and the description still conveys what each item contains. Coverage is slightly short on situational routing versus the read-heavy siblings, but nothing needed to invoke the tool correctly is missing.
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 100%, so both agent_id and the severity enum are fully documented in the schema itself. The description's note that results can be narrowed to a single severity adds marginal value over the schema's 'Optional: only return recommendations at this severity'.
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?
States a specific verb and resource: returns open issues detected on one server, ranked by severity, each with a description and suggested fix. The scope (single server, open issues only) is precise enough to separate it from list_agents or get_log_summary, though no sibling is named explicitly.
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?
Implied usage comes through the scoping ('on one server') and the optional severity filter, but there is no statement of when to prefer this over get_server_overview or get_incident_timeline, nor any prerequisite guidance. Adequate but leaves the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_overviewServer overviewARead-onlyIdempotentInspect
Returns a snapshot of one server: CPU %, 1-minute load average and core count, memory %, disk usage per mount, uptime, the five processes using the most CPU, and the number of detected services and apps.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present when the server has sent no heartbeat yet. |
| disks | No | Disk usage per mount. |
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| online | No | Whether a heartbeat arrived recently. |
| hostname | No | Hostname. |
| app_count | No | Number of detected applications. |
| cpu_cores | No | CPU cores. |
| databases | No | |
| cpu_percent | No | CPU usage %, latest heartbeat. |
| load_avg_1m | No | 1-minute load average. |
| mem_percent | No | Memory usage %. |
| service_count | No | Number of detected services. |
| uptime_seconds | No | Seconds since boot. |
| cpu_reality_check | No | Present when cpu_percent and the load average disagree; explains which to trust. |
| top_processes_by_cpu | No | Five processes using the most CPU. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds scope-of-return context but nothing beyond annotations on behavior — no indication of snapshot freshness, caching, cost, or permissions needed to query a remote agent.
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?
A single front-loaded sentence with no filler; the return contents are listed compactly. The enumeration is long but each item is genuinely selective information, so little is wasted.
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?
An output schema exists, so the return-shape enumeration is largely reinforcing rather than required, and annotations carry the safety profile. The remaining gap is routing guidance: nothing tells the agent when to prefer this over get_kubernetes_snapshot, get_services, or get_log_summary.
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?
Only one parameter (agent_id) exists and the schema documents it at 100% coverage ('The server/agent UUID to query.'). The description adds no additional parameter semantics, so the schema-description baseline of 3 applies.
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?
States a specific verb (get) and resource (one server's overview) and itemizes exactly what the snapshot contains — CPU %, load average, core count, memory %, per-mount disk usage, uptime, top-5 CPU processes, and service/app counts. This distinguishes it in substance from siblings like get_kubernetes_snapshot or get_services, though it never explicitly contrasts itself with 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?
There is no explicit when-to-use or when-not-to-use statement. Usage is only implied by the enumerated contents (reach for this when you need a quick system-health snapshot of a single server), and the closely related siblings get_kubernetes_snapshot, get_services, and get_recommendations are not addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_servicesServicesBRead-onlyIdempotentInspect
Returns the services detected on one server (systemd units, Docker containers, PM2 processes) and whether each is running.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | The server/agent UUID to query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| services | No | Detected services. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds that results include both detection and running state across multiple service managers, which is useful context, but it says nothing about behavior when the agent is unknown, staleness of detection, or result volume.
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?
One sentence, front-loaded with the verb and resource, with the service-manager enumeration placed inline rather than padding out extra sentences. Zero waste.
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?
An output schema exists, so return-value structure need not be re-explained, and the read-only annotations cover safety. For a simple one-param read tool this is nearly complete; only failure modes and staleness of detection are left unaddressed.
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 100% for the single agent_id parameter, so the schema already carries the semantics. The description's 'on one server' reinforces the single-server scope but adds no format or constraint detail beyond the schema. Baseline 3 applies.
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?
States a specific verb (returns) and resource (services detected on one server), and enumerates the concrete sources covered: systemd units, Docker containers, PM2 processes. It also names the payload (running status). It does not explicitly distinguish itself from siblings like get_kubernetes_snapshot, but the scope 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?
There is no when-to-use guidance, no exclusions, and no mention of alternatives despite related siblings such as get_server_overview and get_kubernetes_snapshot. The only usage signal is the implied 'one server' scoping, which comes from the schema rather than the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agentsList serversARead-onlyIdempotentInspect
Lists the servers and Kubernetes clusters in the signed-in Opservo workspace, with each one's agent_id, kind (linux server or kubernetes cluster), hostname, display name and whether it is online. Archived servers are left out.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster). |
| agents | No | Servers and clusters in the workspace, most recently seen first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds real context beyond that: the exact attributes returned (agent_id, kind, hostname, display name, online status) and the filtering rule that archived servers are excluded. Pagination or result-size behavior is not mentioned.
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?
Two sentences, zero filler, with the core purpose front-loaded and the archived-server caveat placed last where it belongs. Every clause carries information.
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?
An output schema exists, so return values need not be explained, yet the prose field list makes the result self-describing anyway. For a zero-parameter, read-only listing tool, nothing an agent needs in order to call it correctly is missing.
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 tool takes zero parameters, so there is no parameter semantics to document and the baseline is 4. The description's field list describes the output shape rather than any input, which is appropriate and adds no confusion.
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?
States a specific verb and resource ('Lists the servers and Kubernetes clusters in the signed-in Opservo workspace') and enumerates the fields returned, so the agent knows exactly what the call yields. The plural, whole-workspace scope implicitly separates it from the singular get_* siblings (get_server_overview, get_kubernetes_snapshot), but no sibling is named explicitly.
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 only implied: the description conveys that this is the enumeration entry point, and the note 'Archived servers are left out' hints at scoping. There is no explicit when-to-use, when-not-to-use, or pointer to get_server_overview for deeper per-server detail.
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.
9 tool updates
- Changed
get_domains1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "domains": { + "description": "Domains from the nginx/Apache configuration.", + "items": { + "additionalProperties": true, + "properties": { + "days_until_expiry": { + "description": "Days until the SSL certificate expires; null when unknown.", + "type": [ + "integer", + "null" + ] + }, + "domain": { + "description": "Domain served by the web server.", + "type": "string" + }, + "ssl_error": { + "description": "Present when the certificate could not be checked.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_incident_timeline1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + }, + "events": { + "description": "Correlated events, oldest first.", + "items": { + "additionalProperties": true, + "properties": { + "caused_by": { + "description": "Id of the event this one is attributed to, when a cause was identified.", + "type": [ + "string", + "null" + ] + }, + "detail": { + "description": "What was observed.", + "type": "string" + }, + "id": { + "description": "Event id, unique within the timeline.", + "type": "string" + }, + "service": { + "description": "Service involved, if any.", + "type": [ + "string", + "null" + ] + }, + "timestamp": { + "description": "When the event happened, ISO 8601.", + "type": "string" + }, + "title": { + "description": "One-line title.", + "type": "string" + }, + "type": { + "description": "Event type: service_crash, error_spike, warning_spike, metric_threshold, ssl_expiry, recommendation or similar.", + "type": "string" + } + }, + "required": [ + "id", + "timestamp", + "type", + "title" + ], + "type": "object" + }, + "type": "array" + }, + "root_cause": { + "additionalProperties": true, + "description": "The event the others are attributed to, or null.", + "properties": { + "caused_by": { + "description": "Id of the event this one is attributed to, when a cause was identified.", + "type": [ + "string", + "null" + ] + }, + "detail": { + "description": "What was observed.", + "type": "string" + }, + "id": { + "description": "Event id, unique within the timeline.", + "type": "string" + }, + "service": { + "description": "Service involved, if any.", + "type": [ + "string", + "null" + ] + }, + "timestamp": { + "description": "When the event happened, ISO 8601.", + "type": "string" + }, + "title": { + "description": "One-line title.", + "type": "string" + }, + "type": { + "description": "Event type: service_crash, error_spike, warning_spike, metric_threshold, ssl_expiry, recommendation or similar.", + "type": "string" + } + }, + "required": [ + "id", + "timestamp", + "type", + "title" + ], + "type": [ + "object", + "null" + ] + }, + "window_end": { + "description": "End of the look-back window, ISO 8601.", + "type": "string" + }, + "window_start": { + "description": "Start of the look-back window, ISO 8601.", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_kubernetes_snapshot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "collected_at": { + "description": "When the snapshot was taken, ISO 8601.", + "type": "string" + }, + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + }, + "events": { + "description": "Recent warning events.", + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + }, + "nodes": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "pods": { + "additionalProperties": true, + "properties": { + "problems": { + "description": "Pods with a problem: reason, last exit code, restarts, recent log lines.", + "items": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "version": { + "description": "Kubernetes server version.", + "type": "string" + }, + "workloads": { + "additionalProperties": true, + "properties": {}, + "type": "object" + } + }, + "type": "object" +}
- Changed
get_log_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + }, + "summary": { + "additionalProperties": true, + "description": "Latest AI-written summary, or null when none has been generated.", + "properties": { + "generated_at": { + "description": "When it was written, ISO 8601.", + "type": "string" + }, + "health": { + "description": "healthy, degraded or critical.", + "type": "string" + }, + "summary": { + "description": "Plain-English summary of the last hour of logs.", + "type": "string" + }, + "top_issues": { + "description": "Most important issues named in the summary.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": [ + "object", + "null" + ] + }, + "top_clusters": { + "description": "Five most frequent log patterns from the last hour.", + "items": { + "additionalProperties": true, + "properties": { + "count": { + "description": "Occurrences in the last hour.", + "type": [ + "integer", + "null" + ] + }, + "last_seen": { + "description": "Last occurrence, ISO 8601.", + "type": "string" + }, + "level": { + "description": "Log level.", + "type": "string" + }, + "representative_message": { + "description": "Normalised example line for the pattern.", + "type": "string" + }, + "source": { + "description": "Log source: nginx, apache, laravel, docker, pm2, systemd.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
get_recent_commands1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "commands": { + "description": "Newest first.", + "items": { + "additionalProperties": true, + "properties": { + "command": { + "description": "Command text as run.", + "type": "string" + }, + "completed_at": { + "description": "When it finished, ISO 8601.", + "type": [ + "string", + "null" + ] + }, + "created_at": { + "description": "When it was queued, ISO 8601.", + "type": "string" + }, + "exit_code": { + "description": "Process exit code, null while running.", + "type": [ + "integer", + "null" + ] + }, + "source": { + "description": "Where it came from: terminal, quick_action, ai_fix, fleet_run and so on.", + "type": "string" + }, + "status": { + "description": "queued, dispatched, done, error, expired or cancelled.", + "type": "string" + }, + "stderr": { + "description": "Start of standard error (truncated at 2000 characters).", + "type": [ + "string", + "null" + ] + }, + "stdout": { + "description": "Start of standard output (truncated at 2000 characters).", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_recommendations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + }, + "recommendations": { + "description": "Open issues, critical first.", + "items": { + "additionalProperties": true, + "properties": { + "category": { + "description": "Area: performance, security, storage, reliability, database and so on.", + "type": "string" + }, + "description": { + "description": "What was detected and why it matters.", + "type": "string" + }, + "fix": { + "description": "Suggested fix, usually with the command in backticks.", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "Severity of the finding.", + "enum": [ + "critical", + "warning", + "info" + ], + "type": "string" + }, + "title": { + "description": "One-line title.", + "type": "string" + } + }, + "required": [ + "severity", + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
get_server_overview1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "app_count": { + "description": "Number of detected applications.", + "type": [ + "integer", + "null" + ] + }, + "cpu_cores": { + "description": "CPU cores.", + "type": [ + "integer", + "null" + ] + }, + "cpu_percent": { + "description": "CPU usage %, latest heartbeat.", + "type": [ + "number", + "null" + ] + }, + "cpu_reality_check": { + "description": "Present when cpu_percent and the load average disagree; explains which to trust.", + "type": "string" + }, + "databases": { + "additionalProperties": true, + "properties": {}, + "type": "object" + }, + "disks": { + "description": "Disk usage per mount.", + "items": { + "additionalProperties": true, + "properties": { + "mount": { + "description": "Mount point.", + "type": "string" + }, + "percent": { + "description": "Disk usage %.", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + }, + "hostname": { + "description": "Hostname.", + "type": "string" + }, + "load_avg_1m": { + "description": "1-minute load average.", + "type": [ + "number", + "null" + ] + }, + "mem_percent": { + "description": "Memory usage %.", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "Present when the server has sent no heartbeat yet.", + "type": "string" + }, + "online": { + "description": "Whether a heartbeat arrived recently.", + "type": "boolean" + }, + "service_count": { + "description": "Number of detected services.", + "type": [ + "integer", + "null" + ] + }, + "top_processes_by_cpu": { + "description": "Five processes using the most CPU.", + "items": { + "additionalProperties": true, + "properties": { + "cpu_percent": { + "description": "CPU %.", + "type": [ + "number", + "null" + ] + }, + "mem_mb": { + "description": "Resident memory, MB.", + "type": [ + "number", + "null" + ] + }, + "name": { + "description": "Process name.", + "type": "string" + }, + "pid": { + "description": "PID.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "uptime_seconds": { + "description": "Seconds since boot.", + "type": [ + "integer", + "null" + ] + } + }, + "type": "object" +}
- Changed
get_services1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + }, + "services": { + "description": "Detected services.", + "items": { + "additionalProperties": true, + "properties": { + "name": { + "description": "Service name.", + "type": "string" + }, + "status": { + "description": "running, stopped, failed, exited or similar.", + "type": "string" + }, + "type": { + "description": "systemd, docker or pm2.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
list_agents1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "agents": { + "description": "Servers and clusters in the workspace, most recently seen first.", + "items": { + "additionalProperties": true, + "properties": { + "agent_id": { + "description": "Server id (UUID) used by every per-server tool.", + "type": "string" + }, + "hostname": { + "description": "Hostname reported by the agent.", + "type": "string" + }, + "kind": { + "description": "linux server or kubernetes cluster.", + "enum": [ + "linux", + "kubernetes" + ], + "type": "string" + }, + "log_health": { + "description": "Latest log-summary health: healthy, degraded, critical or unknown.", + "type": "string" + }, + "name": { + "description": "Display name set in Opservo, when it differs from the hostname.", + "type": "string" + }, + "online": { + "description": "Whether a heartbeat arrived recently.", + "type": "boolean" + }, + "tags": { + "description": "Tags set in Opservo.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "agent_id", + "hostname", + "kind", + "online" + ], + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Present only when the call failed: why, in plain English (unknown server, server from another workspace, not a Kubernetes cluster).", + "type": "string" + } + }, + "type": "object" +}
9 tool updates
- First observed
get_domains - First observed
get_incident_timeline - First observed
get_kubernetes_snapshot - First observed
get_log_summary - First observed
get_recent_commands - First observed
get_recommendations - First observed
get_server_overview - First observed
get_services - First observed
list_agents
Publisher details
- Operator
- Opservo
- Operator website
- https://getopservo.com
- Vendor relationship
- First-party
- Documentation
- https://getopservo.com/docs/mcp
- Trust center
- https://getopservo.com/security
- Restrictions
- Requires an Opservo account (free plan available) with at least one server or Kubernetes cluster connected. Sign in with Opservo (OAuth 2.1, standard dynamic client registration — no custom OAuth app needed) or use a workspace API token. Viewer-role members can't connect apps. All tools are read-only. Limit: 120 requests per minute per token.
Related MCP Connectors
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Real-time infrastructure monitoring with metrics, logs, alerts, and ML-based anomaly detection.
Open-source agent that observes and fixes your application. Query logs, traces, metrics, incidents.
Related MCP Servers
- AlicenseBqualityCmaintenanceSSH Linux metrics, baselines, anomaly detection, and plain-English infrastructure explanations.5 npm1MIT
- AlicenseAqualityDmaintenanceA secure, read-only MCP server for AI-powered system monitoring. It provides real-time OS metrics, config discovery, and safe log tailing to enable autonomous infrastructure audits without shell access risks.41ISC
- AlicenseBqualityCmaintenanceEnables read-only, stack-aware diagnostics for microservices on Kubernetes, turning debugging runbooks into conversational tools that investigate slow requests, changes, leaks, and in-pod conditions without exposing cluster credentials.57Apache 2.0
- AlicenseAqualityAmaintenanceLets an AI assistant inspect a Linux machine through ten fixed read-only tools covering load, memory, disks, processes, ports, interfaces, systemd units, the journal, and allowlisted log files. All output is size-capped, control-character-stripped and secret-redacted, and nothing in the package can write to the system.10MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.