Skip to main content
Glama
jagalliers

appd-mcp

by jagalliers

appd-mcp

CI License: MIT Node

What is this? A Model Context Protocol server, written in TypeScript, that exposes 12 read-only AppDynamics capabilities (applications, topology, metrics, snapshots, health rules, anomalies, events, alerting config, analytics events, dependency map) as task-oriented MCP tools an LLM agent can call directly. stdio transport, OAuth API-client credentials, no writes, no persistence beyond a local .env.

appd-mcp is not affiliated with, endorsed by, sponsored by, or certified by Cisco Systems, Inc., Splunk LLC, or AppDynamics, LLC. See TRADEMARKS.md.

Quickstart (60 seconds)

Requires Node 22+ and pnpm.

git clone https://github.com/jagalliers/appd-mcp.git
cd appd-mcp
pnpm install
pnpm build
pnpm wizard      # interactive wizard: prompts, validates, writes .env, registers in MCP host

v0.1.1 and earlier docs may say pnpm setup. That name was renamed to pnpm wizard in v0.1.2 because setup collides with pnpm's built-in command (it configures PNPM_HOME / PATH, not our wizard).

That's it. The wizard probes your live AppDynamics Controller before saving anything, refuses http:// URLs, won't run unattended (TTY required), and writes .env with 0600 perms plus a timestamped backup. Re-runs are idempotent.

If you'd rather configure by hand, see Documentation → Manual configuration below.

Related MCP server: meraki-dashboard-api

Tools

Tool

Capability

appd_list_applications

List business applications

appd_get_application_model

Topology: business transactions, tiers, nodes, backends

appd_get_metric_hierarchy

Discover valid metric paths

appd_query_metrics

Query metric-data-v2 with rollup + time range

appd_get_transaction_snapshots

Slow/error/diagnostic snapshots with optional exit calls

appd_get_health_rule_violations

Active/recent health rule violations

appd_get_anomaly_violations

Anomaly violations + suspected causes

appd_get_events

Event timeline (deployments, errors, custom, etc.)

appd_list_health_rules

List/inspect health rule definitions

appd_get_alerting_config

Composite: policies + actions + schedules + health-rules

appd_query_analytics_events

ADQL queries against the Events Service

appd_get_dependency_map

Synthesized service dependency map

Status

Phase 1: read-only MVP. All 12 tools are read-only against the public AppDynamics Controller, Alerting, Anomaly Violation, and Events Service APIs.

Limitations and non-goals

This is intentionally a small, focused project. The following are out of scope for the current release:

  • No write/change tools. Nothing in this server mutates AppDynamics state. Phase 3 will introduce write tools with per-tool allowlist + dryRun + confirm + audit gating; until then the server is provably read-only by construction.

  • No sensitive-read tools. Audit logs, RBAC details, and PII surfaces are deferred to Phase 2.

  • No on-prem auth modes yet. OAuth API-client credentials are the only auth path. Username + access-key, SAML federation, and on-prem proxy patterns are open questions in AGENT_BOOTSTRAP.md §8.

  • No Synthetic. AppDynamics Synthetic monitoring tools are not in this MVP.

  • No persistent server-side state. Caches are in-process LRU, resetting on restart.

  • No production hosting opinion. The intended deployment is per-developer, per-MCP-host (Cursor or Claude Desktop on a workstation). Multi-tenant, internet-facing deployment is not a goal.

See AGENT_BOOTSTRAP.md for the full phase roadmap.

Documentation

Setup wizard

pnpm wizard runs an interactive wizard that drops you into a working install in five steps:

  1. Prerequisites — checks Node version, that dist/index.js exists, and that .env is writable. Detects Cursor / Claude Desktop installations.

  2. Collect — prompts for Controller URL, account name (auto-suggested from the URL's leftmost label), API Client ID, and API Client Secret. Optionally collects Events Service URL and key. Always re-prompts secrets across retries.

  3. Probe — exercises the OAuth endpoint, lists applications via the Controller, and (if events were configured) issues a smoke ADQL. A failure shows the exact endpoint and offers Edit / Save-anyway / Quit, bounded to 3 attempts. A 500 Error provisioning account on any cluster on the Events probe degrades to SKIP (the tenant simply isn't entitled for Analytics) instead of failing the wizard.

  4. Persist — atomic-write .env with a timestamped .bak.<ISO> and chmod 0600. Pre-validates against the Zod runtime schema before writing.

  5. MCP host wiring — pick from Cursor (project), Cursor (user), or Print snippet only. The chosen target uses Cursor's native envFile field so no secrets land in mcp.json.

The wizard refuses to run when stdin is not a TTY (no piping secrets) and rejects http:// URLs as a hard-stop. Exit codes: 0 success, 1 user-driven abort, 2 safety-gate decline / non-TTY.

To verify a saved .env against the live Controller without reconfiguring anything, run:

pnpm wizard-live-probe

Manual configuration

If you don't want to use pnpm wizard, all configuration is via environment variables. See .env.example for the full list. Required:

  • APPD_CONTROLLER_URL — the AppDynamics Controller base URL.

  • APPD_ACCOUNT_NAME — your tenant name.

  • APPD_API_CLIENT_ID / APPD_API_CLIENT_SECRET — OAuth API Client credentials (create in the Controller UI under Settings → Administration → API Clients).

Optional:

  • APPD_EVENTS_SERVICE_URL / APPD_EVENTS_API_KEY — only needed for appd_query_analytics_events.

  • APPD_TIMEOUT_MS, APPD_LOG_LEVEL, APPD_TOOLS_ENABLED — tuning.

Then start the server directly:

node --env-file=.env dist/index.js

Wiring into a host

Cursor supports both workspace-scoped (<repo>/.cursor/mcp.json, ships with the repo) and user-scoped (~/.cursor/mcp.json, applies globally) MCP config. For dev-on-this-repo use, the workspace scope is cleanest because it uses Cursor's ${workspaceFolder} variable and Cursor's native envFile support — no absolute paths.

<repo>/.cursor/mcp.json:

{
  "mcpServers": {
    "appdynamics": {
      "type": "stdio",
      "command": "node",
      "args": ["${workspaceFolder}/dist/index.js"],
      "envFile": "${workspaceFolder}/.env"
    }
  }
}

Then, in Cursor:

  1. Run pnpm install && pnpm build once, and create .env (see Manual configuration).

  2. Restart Cursor (or reload the window).

  3. Open Settings → Tools & MCP (Cmd+Shift+J → Features → Model Context Protocol). Toggle the appdynamics server on.

  4. The 12 appd_* tools become available to the agent. The agent will ask for confirmation before invoking them by default; Output → MCP Logs is the place to debug if a server fails to start.

This repo's default .gitignore excludes .cursor/, so .cursor/mcp.json does not get committed — paste the snippet above into your own checkout.

User-scoped config (~/.cursor/mcp.json) is functionally similar but ${workspaceFolder} doesn't help, so use absolute paths there. See the Cursor MCP docs for details.

pnpm wizard writes either of these for you.

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "appdynamics": {
      "command": "node",
      "args": [
        "--env-file=/absolute/path/to/appd_mcp/.env",
        "/absolute/path/to/appd_mcp/dist/index.js"
      ]
    }
  }
}

Note that Claude Desktop does not currently honor an envFile field, so absolute paths are required.

Development

pnpm install         # one-time
pnpm lint            # biome check
pnpm typecheck       # tsc --noEmit
pnpm test            # vitest run (uses undici.MockAgent — no live AppD calls)
pnpm test:watch      # vitest in watch mode
pnpm build           # tsc -p tsconfig.build.json → dist/
pnpm smoke           # spawn dist/index.js, drive initialize + tools/list (no live AppD calls)
pnpm test:wizard     # in-process behavioral spot-checks for the setup wizard (requires build)

CI (GitHub Actions, see .github/workflows/ci.yml) runs lint → typecheck → test → build → smoke → test:wizard → pnpm audit --audit-level high on every push/PR to main.

Architecture, conventions, decision log, and open questions all live in AGENT_BOOTSTRAP.md. New agents/devs should start there.

Live integration testing

Once you have an AppDynamics tenant + API client credentials, you can exercise all 12 tools end-to-end against a real Controller. The integration runner spawns dist/index.js via the MCP client SDK (the same transport Claude Desktop / Cursor use) and drives a 17-step scenario across health, per-app deep walk, alerting, aggregation, skippable surfaces, and negative paths.

# 1. Drop creds into a local .env (gitignored) — or use `pnpm wizard`.
cp .env.example .env
# edit .env:
#   APPD_CONTROLLER_URL=https://<tenant>.saas.appdynamics.com
#   APPD_API_CLIENT_ID=<api-client-name>
#   APPD_API_CLIENT_SECRET=<secret>

# 2. Confirm the controller's accountName by probing the OAuth endpoint.
#    Tries the subdomain first (e.g. `<tenant>` for SaaS), then `customer1`.
#    If APPD_ACCOUNT_NAME is already set, only that one is tried.
pnpm probe-account
# → prints `APPD_ACCOUNT_NAME=<resolved>` on success.

# 3. Build (ensures dist/ matches src/) and run the full integration walk.
pnpm build
pnpm integration

Per-step JSON artifacts and a combined report.json land under tmp/integration/<ISO-timestamp>/ (gitignored). The runner also captures the spawned server's stderr and asserts that the literal APPD_API_CLIENT_SECRET value never appears in it (defense-in-depth on top of the pino redaction unit tests).

The runner does not run in CI: it requires a long-lived secret and hits a live tenant. Run it locally before any release.

After a successful run, rotate the API client secret in the Controller UI (Administration → API Clients → Generate Secret) — especially if the credential ever transited a chat or shared terminal.

Security

  • No hardcoded secrets. All credentials via env vars.

  • OAuth tokens are never logged (pino redaction is mandatory).

  • stdio transport only — stdout reserved for MCP frames, logs go to stderr.

  • TLS verification on by default. APPD_INSECURE_SKIP_VERIFY=true exists for dev-only and must never be used in production.

For vulnerability disclosure, see SECURITY.md. The full list of conventions lives in AGENT_BOOTSTRAP.md §6 Conventions.

License

MIT. Portions of src/setup/ are ported from the Apache-2.0 licensed spl-bridge project; see NOTICE and THIRD_PARTY_NOTICES.md.

Available Tools

12 tools
appd_get_alerting_configGet AppDynamics alerting configurationA

Composite read: parallel-fetches health rules + policies + actions + schedules for one application via the Alerting REST v1 API. Use this for "what alerts and to whom" inventories.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses that it is a composite read performing parallel fetches via the Alerting REST v1 API. This gives the agent awareness of multiple API calls. It does not cover permissions or rate limits, but read-only nature is implied.

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 sentences: the first explains what the tool does, the second explains its use case. Every word contributes value, and the information is front-loaded. No unnecessary elaboration.

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 an output schema exists, return values do not need description. The description covers the composite nature, API used, and purpose. It lacks detail on potential heavy load or error handling, but overall is complete for an inventory read tool.

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?

The input schema already provides a description for the 'application' parameter (name or numeric id). The tool description does not add any additional meaning beyond stating it operates on one application. With 0% schema_description_coverage (per context), the description should compensate, but it still meets the baseline.

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 it is a composite read that fetches health rules, policies, actions, and schedules for one application. It distinguishes from siblings like appd_list_health_rules which only fetch health rules, making the purpose specific and non-overlapping.

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 ends with 'Use this for "what alerts and to whom" inventories,' providing a clear context for its use. It does not explicitly mention when not to use it or alternatives, but the sibling tools imply those.

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

appd_get_anomaly_violationsGet AppDynamics anomaly violationsB

Retrieve anomaly violations for an application within a time window. Set fetchSuspectedCause=true to include the suspected-cause RCA payload (eventDetailMap.{id}.suspectedCauses[]).

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.
fetchSuspectedCauseNoWhen true, includes eventDetailMap.{id}.suspectedCauses[] for each violation. Heavier response.
pageSizeNo
pageNumberNo0-based page index.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations exist, so the description carries full burden. It only discloses the behavioral impact of fetchSuspectedCause (heavier response), but omits other behavioral traits like read-only nature, permission requirements, rate limits, or pagination behavior. Significant gaps remain.

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 extremely concise at two sentences with zero wasted words. All critical information is front-loaded, and the fetchSuspectedCause detail is efficiently appended.

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 5 parameters including a complex timeRange union and pagination, the description fails to explain most parameters. It only covers fetchSuspectedCause. With an output schema present, return values are covered, but overall context for effective use is lacking.

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?

The description adds meaningful context for fetchSuspectedCause, explaining its effect on response size. However, with 60% schema description coverage and 5 parameters, the description does not compensate for undocumented parameters like pageSize or the timeRange structure in enough detail. Basic value added but insufficient.

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 'Retrieve anomaly violations for an application within a time window', clearly indicating the verb (retrieve) and resource (anomaly violations for an application). It distinguishes from the sibling tool 'appd_get_health_rule_violations' by focusing on anomaly violations versus health rule violations, though it does not explicitly name the sibling.

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 usage for retrieving anomaly violations within a time window, but it does not provide when-to-use or when-not-to-use guidance relative to siblings like 'appd_get_events' or 'appd_get_health_rule_violations'. No alternatives or exclusions are mentioned.

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

appd_get_application_modelGet AppDynamics application modelA

Fetch business transactions, tiers, nodes, and backends for one application in parallel. Anchor for nearly all RCA workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
includeNoSubset of model components to fetch (default: all four). Pass a non-empty array; omit to fetch every component.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A3.8/5.0
Behavior3/5

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

The description discloses the parallel fetching behavior, which is a key behavioral trait beyond the input schema. However, it does not mention any potential side effects, resource implications, or rate limits. Since no annotations are provided, the description carries the full burden for behavioral transparency.

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 sentences: the first delivers the core functionality with action and scope, the second provides contextual importance. Every word earns its place, and the key information is front-loaded.

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?

The description covers the main purpose and hints at the tool's role in RCA workflows. While it does not explicitly mention prerequisites or usage order among siblings, the hint is sufficient given the output schema exists and the tool is relatively straightforward. The completeness is adequate but could be improved with more explicit linkage to other tools.

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?

The description mentions the component types (business transactions, tiers, nodes, backends) that correspond to the 'include' parameter enum values, but it does not add any new meaning beyond what is already in the schema. With schema coverage at 50%, the description partially reinforces the parameter semantics but does not compensate fully.

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 action (fetch) and the resources (business transactions, tiers, nodes, backends) for one application, and highlights the parallel execution. It also positions the tool as an anchor for RCA workflows, distinguishing it from other tools that have more specific scopes.

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 provides context ('Anchor for nearly all RCA workflows') but does not explicitly specify when to use this tool versus its siblings, nor does it mention any prerequisites or exclusions. The guidance is implied rather than direct.

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

appd_get_dependency_mapGet AppDynamics service dependency mapB

Synthesize a tier→tier/backend dependency map from the application model + transaction snapshots (with exit calls). MCP-level aggregation — confidence depends on snapshot density (warning surfaces when sparse).

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

B3.4/5.0
Behavior3/5

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

The description discloses that confidence depends on snapshot density and that a warning surfaces when data is sparse, which is helpful. However, with no annotations, it does not state whether the operation is read-only or destructive, nor any side effects. More behavioral context would improve transparency.

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 sentences: the first defines the core function, the second adds important behavioral nuance about confidence and warnings. It is concise, front-loaded, and every sentence serves a purpose.

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?

For a tool that synthesizes from model and snapshots, the description covers the transformation and output quality hint. With an output schema present, return value details are not needed. However, it lacks prerequisites (e.g., snapshots must exist) and any performance or resource considerations, leaving some gaps for a complex operation.

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?

The description does not add any information beyond the input schema. The schema already describes the parameters (application as name or id, timeRange with type and duration). Given 50% schema description coverage, the description missed an opportunity to clarify parameter usage or defaults beyond what the schema provides.

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 it synthesizes a tier→tier/backend dependency map from the application model and transaction snapshots, which is specific and differentiates it from sibling tools like appd_get_application_model or appd_get_transaction_snapshots. The mention of MCP-level aggregation and confidence dependence on snapshot density adds precision.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus its siblings. The description does not mention prerequisites (e.g., needing transaction snapshots), alternatives, or exclusions. This leaves the agent without context to decide between tools.

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

appd_get_eventsGet AppDynamics eventsB

Retrieve up to 600 events for an application by type and severity within a time window.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
eventTypesYesAppD event types, e.g. APPLICATION_DEPLOYMENT, APPLICATION_ERROR, DIAGNOSTIC_SESSION, CUSTOM, RESOURCE_POOL_LIMIT_REACHED, etc. At least one required, up to 50.
severitiesYesAt least one of INFO, WARN, ERROR.
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

B3.2/5.0
Behavior2/5

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

Without annotations, the description carries the full burden of behavioral disclosure. It mentions the 600-event limit but omits details like pagination behavior, ordering, result format, or read-only nature. A mutation vs read distinction is not clarified.

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 of 17 words, efficiently front-loading the core action and filters. No redundant or unnecessary information.

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 complexity of the timeRange parameter (4 variants) and the presence of an output schema, the description lacks detail on how to construct the time range, what severity values mean, or any examples. It is too sparse for a tool with nested objects.

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 coverage is 75%, and the schema provides descriptions for most parameters. The description adds no additional semantic value beyond summarizing the filter criteria. Baseline of 3 is appropriate as the schema does the heavy lifting.

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 verb 'retrieve', the resource 'events', and key filters (application, type, severity, time window). It also specifies a limit of 600 events. This distinguishes it from sibling tools which deal with alerts, violations, metrics, etc.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, when not to use, or suggest sibling tools for different use cases.

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

appd_get_health_rule_violationsGet AppDynamics health rule violationsA

Retrieve open / recently-closed health rule violations for an application within a time window.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are present, so the description carries full burden. It indicates a read-like operation ('Retrieve') but does not disclose side effects, authentication needs, rate limits, pagination, or any constraints beyond the time window. The description is minimal in behavioral context.

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, front-loaded with the verb, and contains no redundant information. Every word contributes to the purpose, making it highly concise and well-structured.

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 tool is moderately complex with 2 parameters and an output schema. The description covers the basic functionality but lacks details like default time range (though mentioned in schema), return format, or filtering capabilities. It is adequate but not fully comprehensive.

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?

Both parameters (application, timeRange) have detailed descriptions in the schema. The description adds no further meaning beyond the schema, as it only restates the overall purpose. With high schema description coverage, the description provides marginal added value for parameter semantics.

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 verb 'Retrieve' and the resource 'open / recently-closed health rule violations for an application within a time window', which is specific and distinguishes from sibling tools like appd_list_health_rules (lists rules, not violations) and appd_get_anomaly_violations (different violation type).

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 usage for retrieving health rule violations but does not specify when to use this tool versus alternatives like appd_get_anomaly_violations or when not to use it. No explicit context or exclusion criteria are provided.

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

appd_get_metric_hierarchyDiscover AppDynamics metric pathsA

Walk the metric hierarchy for one application. Without metricPath returns top-level folders; with metricPath returns the children at that level. Cached for 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
metricPathNoOptional metric path to drill into, e.g. "Overall Application Performance|Average Response Time (ms)". Use the literal "|" character; the tool encodes it correctly. Leave unset to list root nodes. Max 2048 chars.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses caching behavior (5 minutes) and explains the dual behavior based on parameter presence. It does not cover error conditions or rate limits, but given the missing annotations, it does reasonably well.

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 extremely concise—two sentences that pack essential information. No wasted words, and the purpose is front-loaded.

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 has only 2 parameters (1 required) and an output schema exists, the description covers the core behavior and caching. It could mention pagination or error handling, but for a hierarchy-walking tool, it is sufficiently complete.

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 50%. The description adds meaningful context for the metricPath parameter, including an example and clarification on encoding. The application parameter is well-documented in the schema, so the description does not need to add more.

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 'walks the metric hierarchy' for one application and distinguishes behavior based on whether metricPath is provided: returns top-level folders without it, children at that level with it. This differentiates it from sibling tools like appd_query_metrics.

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 explicitly tells when to use the tool with and without the metricPath parameter. It does not mention when not to use it or suggest alternatives, but the context is clear enough for an agent to decide.

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

appd_get_transaction_snapshotsGet AppDynamics transaction snapshotsA

Retrieve slow/error/diagnostic transaction snapshots for an application. Default cap 100, hard max 600. Use needExitCalls=true to feed dependency-map analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.
businessTransactionIdsNo
tierIdsNo
nodeIdsNo
slowOnlyNoOnly include snapshots flagged slow (deep-dive eligible).
errorOnlyNoOnly include snapshots with errors.
firstInChainNoOnly return originating snapshots (not children).
needExitCallsNoInclude exit calls (DB/HTTP/queue) per snapshot. Required for dependency-map synthesis.
needPropsNoInclude data-collector property fields per snapshot.
maxResultsNoHow many snapshots to request (default 100, max 600 per docs).

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description relies on itself to convey behavioral traits. It discloses capacity limits (cap 100, max 600) and a usage hint, but does not mention whether the operation is read-only, authentication needs, pagination, or response format. It provides some value but not comprehensive transparency.

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 sentences, front-loaded with the core purpose, and includes key constraints and usage hint. Every word contributes value, making it concise and well-structured.

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?

Given the tool's complexity with 11 parameters and an output schema, the description covers only capacity limits and one parameter's use case. It lacks guidance on common filters or response structure, leaving the agent needing to infer from the schema. It is minimally adequate but not fully complete.

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?

The description adds meaning for the needExitCalls parameter by linking it to dependency-map analysis, which is beyond the schema. However, with 64% schema coverage, many parameters already have descriptions; the description does not compensate fully for the undocumented ones. It adds moderate value.

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 verb 'Retrieve' and the resource 'slow/error/diagnostic transaction snapshots for an application', making it specific. It also hints at a sibling tool (dependency map) for context, distinguishing its purpose.

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 provides a hint for when to use the needExitCalls parameter for dependency-map analysis, but does not explicitly state when to use this tool over alternatives or when not to use it. This leaves room for ambiguity.

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

appd_list_applicationsList AppDynamics applicationsA

List business applications visible to the configured API Client. Optionally filter to apps that have been "alive" in the last N minutes (SaaS only).

ParametersJSON Schema
NameRequiredDescriptionDefault
aliveWithinMinutesNoSaaS-only: filter to applications that have been alive within the last N minutes (uses time-range-type=BEFORE_NOW). Omit to list all. Max 525600 (365 days).

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries full burden. It discloses the scope (visible to configured API Client) and filter limitation (SaaS only), but does not mention pagination, rate limits, or output structure beyond what the output schema provides.

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 concise sentence that front-loads the core purpose and includes the optional filter with its constraint. No wasted words.

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 list tool with one optional parameter and an existing output schema, the description is fairly complete. It covers the main functionality and filter conditions. Minor gaps include lack of mention of result ordering or limits, but overall adequate.

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 100%, and the tool description adds no additional meaning beyond the schema. The description reiterates the filter option but does not provide new insights into the parameter's semantics or usage.

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 it lists business applications visible to the configured API Client, with an optional alive filter. The verb 'list' and resource 'applications' are specific, and the description distinguishes from sibling 'get' tools that target specific items.

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 provides a usage condition for the filter (SaaS only) but does not explicitly state when not to use this tool or suggest alternative tools from the sibling list. The guidance is implicit.

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

appd_list_health_rulesList AppDynamics health rulesB

List health rule summaries (id, name, enabled) for an application via the Alerting REST v1 API. Optionally fan out to fetch full rule definitions.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
expandDetailsNoWhen true, fan out per-rule GETs to fetch full health rule definitions (in addition to the list summaries). Default false to keep the call cheap.
maxDetailFanoutNoCap on per-rule detail fetches when expandDetails=true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description must disclose behavioral traits. It mentions the API and optional fan-out for full definitions, but omits details like error handling, performance impact, or required permissions. Partial transparency.

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 concise sentences, front-loaded with purpose and optional behavior. No extraneous information.

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?

Output schema exists, so return values need not be described. Tool is simple with 3 params, but lacks context on usage scenarios, limitations, or error states. Adequate but with notable 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 coverage is 67% and the description does not explain parameters individually. It hints at expandDetails with 'optionally fan out' but does not describe application or maxDetailFanout. Minimal added value beyond 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?

Description clearly states the tool lists health rule summaries (id, name, enabled) for an application via the Alerting REST v1 API, and optionally fetches full rule definitions. This is specific and distinguishes from siblings that deal with violations or other configs.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like appd_get_health_rule_violations or appd_get_alerting_config. The description only states what it does, not when it is appropriate.

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

appd_query_analytics_eventsQuery AppDynamics Analytics Events (ADQL)A

Run an ADQL query against the Events Service. Mode A: single ADQL string. Mode B: array of ≤20 query objects. Requires APPD_EVENTS_SERVICE_URL and APPD_EVENTS_API_KEY to be configured.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSingle ADQL query string, e.g. "SELECT * FROM transactions WHERE eventTimestamp > 0". Max 8192 chars.
queriesNoMulti-query mode: array of ADQL query objects (≤ 20). Mutually exclusive with `query`.
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.
limitNoMax rows to return (default 100). Single-query only; multi-query embeds limit per item.
modeNoCursor mode. "scroll" not permitted in multi-query.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It discloses the two modes and the need for env vars, but does not describe read/write nature, rate limits, pagination, or error handling. The description is adequate but not rich; the schema covers limits and mutual exclusion.

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 sentences, front-loaded with the main purpose, and contains no unnecessary words. It efficiently communicates the essential information.

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 presence of an output schema and high parameter coverage, the description does not need to explain return values. It covers the main purpose, modes, and prerequisites. Minor gaps: could clarify that limit is single-query only, but schema already states that.

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 100%, so the schema already documents all parameters. The tool description adds no additional meaning beyond mentioning two modes, which is already implied by the parameter descriptions. Baseline of 3 is appropriate.

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 action (run an ADQL query), the resource (Events Service), and distinguishes two modes (single string vs array). It differentiates from sibling tools like appd_query_metrics by specifying ADQL against Events Service.

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?

It mentions two modes and prerequisites (env vars), but does not explicitly state when to use one mode over the other or contrast with sibling tools like appd_get_events. The context is clear but lacks explicit when-to-use and when-not-to-use guidance.

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

appd_query_metricsQuery AppDynamics metrics (metric-data-v2)A

Fetch one or more metric paths over a time range using metric-data-v2. Defaults to BEFORE_NOW 30 minutes with rollup=true. Surfaces granularity and long-window warnings.

ParametersJSON Schema
NameRequiredDescriptionDefault
applicationYes
metricPathsYesOne or more AppD metric paths, e.g. "Overall Application Performance|Average Response Time (ms)". Up to 20 paths fan out in parallel; each ≤ 2048 chars.
timeRangeNoAppD time range. Defaults to BEFORE_NOW with durationMinutes=30 if omitted by the caller.
rollupNoWhen true (default), aggregates over the window. When false, returns the raw timeseries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
evidenceNo
entitiesYes
timeRangeNo
sourceEndpointsYes
paginationNo
warningsYes
truncatedYes

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses default behavior (BEFORE_NOW 30 minutes, rollup=true) and mentions surfacing granularity/long-window warnings. As a read operation without annotations, this provides adequate transparency.

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 extremely concise with three sentences, each providing essential information without redundancy.

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?

Combined with the output schema, the description covers key behavior, defaults, and warnings. It lacks mention of parallel path fan-out, but the schema covers that.

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

Parameters5/5

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

The description adds value beyond the schema by specifying defaults and warning behavior. The schema already covers parameter descriptions, but the description enhances understanding with operational details.

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 fetches metric paths over a time range using metric-data-v2. It specifies the verb 'Fetch' and the resource 'metric paths', distinguishing it from siblings like appd_query_analytics_events.

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?

No explicit when-to-use or when-not-to-use guidance is given. However, the purpose is specific enough that agents can infer usage based on sibling tool names.

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. Dates show when Glama detected each change.

  1. 12 tool updatesv0.1.2
    • Changedappd_get_alerting_config1 field changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
    • Changedappd_get_anomaly_violations2 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedappd_get_application_model4 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / include / description
        Previous value: -"Subset of model components to fetch (default: all four)."New value: +"Subset of model components to fetch (default: all four). Pass a non-empty array; omit to fetch every component."
      • addedInput schema / properties / include / maxItems
        Added value: +4
      • addedInput schema / properties / include / minItems
        Added value: +1
    • Changedappd_get_dependency_map2 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedappd_get_events6 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / eventTypes / description
        Previous value: -"AppD event types, e.g. APPLICATION_DEPLOYMENT, APPLICATION_ERROR, DIAGNOSTIC_SESSION, CUSTOM, RESOURCE_POOL_LIMIT_REACHED, etc. At least one required."New value: +"AppD event types, e.g. APPLICATION_DEPLOYMENT, APPLICATION_ERROR, DIAGNOSTIC_SESSION, CUSTOM, RESOURCE_POOL_LIMIT_REACHED, etc. At least one required, up to 50."
      • addedInput schema / properties / eventTypes / items / maxLength
        Added value: +64
      • addedInput schema / properties / eventTypes / maxItems
        Added value: +50
      • addedInput schema / properties / severities / maxItems
        Added value: +3
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedappd_get_health_rule_violations2 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedappd_get_metric_hierarchy4 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / metricPath / description
        Previous value: -"Optional metric path to drill into, e.g. \"Overall Application Performance|Average Response Time (ms)\". Use the literal \"|\" character; the tool encodes it correctly. Leave unset to list root nodes."New value: +"Optional metric path to drill into, e.g. \"Overall Application Performance|Average Response Time (ms)\". Use the literal \"|\" character; the tool encodes it correctly. Leave unset to list root nodes. Max 2048 chars."
      • addedInput schema / properties / metricPath / maxLength
        Added value: +2048
      • addedInput schema / properties / metricPath / minLength
        Added value: +1
    • Changedappd_get_transaction_snapshots5 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • addedInput schema / properties / businessTransactionIds / maxItems
        Added value: +200
      • addedInput schema / properties / nodeIds / maxItems
        Added value: +200
      • addedInput schema / properties / tierIds / maxItems
        Added value: +200
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedappd_list_applications2 fields changed
      • changedInput schema / properties / aliveWithinMinutes / description
        Previous value: -"SaaS-only: filter to applications that have been alive within the last N minutes (uses time-range-type=BEFORE_NOW). Omit to list all."New value: +"SaaS-only: filter to applications that have been alive within the last N minutes (uses time-range-type=BEFORE_NOW). Omit to list all. Max 525600 (365 days)."
      • addedInput schema / properties / aliveWithinMinutes / maximum
        Added value: +525600
    • Changedappd_list_health_rules1 field changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
    • Changedappd_query_analytics_events3 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Single ADQL query string, e.g. \"SELECT * FROM transactions WHERE eventTimestamp > 0\""New value: +"Single ADQL query string, e.g. \"SELECT * FROM transactions WHERE eventTimestamp > 0\". Max 8192 chars."
      • addedInput schema / properties / query / maxLength
        Added value: +8192
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedappd_query_metrics4 fields changed
      • changedInput schema / properties / application / anyOf
        Previous value: -[
        -  {
        -    "description": "Application name",
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  {
        -    "description": "Application numeric id",
        -    "exclusiveMinimum": 0,
        -    "type": "integer"
        -  }
        -]New value: +[
        +  {
        +    "description": "Application name (1–255 chars)",
        +    "maxLength": 255,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "description": "Application numeric id",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  }
        +]
      • changedInput schema / properties / metricPaths / description
        Previous value: -"One or more AppD metric paths, e.g. \"Overall Application Performance|Average Response Time (ms)\". Up to 20 paths fan out in parallel."New value: +"One or more AppD metric paths, e.g. \"Overall Application Performance|Average Response Time (ms)\". Up to 20 paths fan out in parallel; each ≤ 2048 chars."
      • addedInput schema / properties / metricPaths / items / maxLength
        Added value: +2048
      • changedInput schema / properties / timeRange / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_NOW",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BEFORE_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "durationMinutes": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "AFTER_TIME",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "durationMinutes",
        -      "startTimeMs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "endTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "startTimeMs": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "BETWEEN_TIMES",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "startTimeMs",
        -      "endTimeMs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 525600,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_NOW",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "endTimeMs": {
        +        "exclusiveMinimum": 0,
        +        "maximum": 253402300799000,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "BEFORE_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "durationMinutes": {
        +        "$ref": "#/properties/timeRange/anyOf/0/properties/durationMinutes"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "AFTER_TIME",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "durationMinutes",
        +      "startTimeMs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "startTimeMs": {
        +        "$ref": "#/properties/timeRange/anyOf/1/properties/endTimeMs"
        +      },
        +      "type": {
        +        "const": "BETWEEN_TIMES",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "startTimeMs",
        +      "endTimeMs"
        +    ],
        +    "type": "object"
        +  }
        +]
  2. 12 tool updatesv0.1.0
    • First observedappd_get_alerting_config
    • First observedappd_get_anomaly_violations
    • First observedappd_get_application_model
    • First observedappd_get_dependency_map
    • First observedappd_get_events
    • First observedappd_get_health_rule_violations
    • First observedappd_get_metric_hierarchy
    • First observedappd_get_transaction_snapshots
    • First observedappd_list_applications
    • First observedappd_list_health_rules
    • First observedappd_query_analytics_events
    • First observedappd_query_metrics

TDQS

A3.9/5.0
Disambiguation5/5

Each tool targets a distinct AppDynamics resource or function (e.g., alerting config, anomaly violations, application model, dependency map, events, health rule violations, metric hierarchy, transaction snapshots, applications list, health rules list, analytics events, metrics query). No overlapping purposes; descriptions clearly differentiate the tools.

Naming Consistency5/5

All tools follow a consistent 'appd_verb_noun' pattern in snake_case. Verbs are predominantly 'get', 'list', or 'query', applied appropriately to each operation. The naming is predictable and aids agent selection.

Tool Count5/5

12 tools is well-scoped for an AppDynamics monitoring server. The set covers essential monitoring and RCA workflows without being overwhelming. Each tool serves a clear purpose and earns its place.

Completeness4/5

The tool surface covers key monitoring operations: application discovery, model, health rule violations, anomaly violations, events, metrics, transaction snapshots, dependencies, alerting config, health rules, metric hierarchy, and analytics events. Minor gaps exist (e.g., no tool for dashboard retrieval or detailed health rule by ID), but core workflows are fully supported.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    A
    maintenance
    A comprehensive read-only MCP server for Datadog, providing 117 tools to query logs, APM, metrics, monitors, dashboards, SLOs, and more, with zero write capabilities for safe AI integration.
    100
    1,106
    2
    MIT
  • F
    license
    B
    quality
    B
    maintenance
    Read-only MCP server wrapping the Redash REST API, enabling query listing, execution, data source inspection, and dashboard retrieval with optional per-user API key support.
    7
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only MCP server that provides tools to list and read devices, MDM servers, blueprints, configurations, apps, packages, users, and other resources from Apple Business Manager and Apple School Manager.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jagalliers/appd-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server