appd-mcp
This server is a read-only Model Context Protocol (MCP) interface for AppDynamics, exposing 12 tools that allow LLM agents to query and analyze an AppDynamics environment. All operations are strictly read-only and use OAuth API-client credentials for authentication.
List Applications (
appd_list_applications): Retrieve all business applications visible to the configured API client, with optional filtering by recent activity.Get Application Model (
appd_get_application_model): Fetch the full topology of an application including business transactions, tiers, nodes, and backends — the primary anchor for root cause analysis workflows.Discover Metric Paths (
appd_get_metric_hierarchy): Walk the metric folder hierarchy for an application to discover valid metric paths (cached for 5 minutes).Query Metrics (
appd_query_metrics): Fetch up to 20 metric time series in parallel, supporting rollup aggregation and customizable time ranges.Get Transaction Snapshots (
appd_get_transaction_snapshots): Retrieve slow, error, or diagnostic transaction snapshots with optional exit call details (DB/HTTP/queue) for dependency analysis.Get Health Rule Violations (
appd_get_health_rule_violations): Retrieve open or recently-closed health rule violations within a specified time window.Get Anomaly Violations (
appd_get_anomaly_violations): Retrieve anomaly violations with optional suspected-cause RCA payloads for incident analysis.Get Events (
appd_get_events): Fetch up to 600 events (deployments, errors, custom, etc.) filtered by type and severity within a time window.List Health Rules (
appd_list_health_rules): List health rule summaries (id, name, enabled status) with an option to fan-out and fetch full rule definitions.Get Alerting Configuration (
appd_get_alerting_config): Composite parallel fetch of health rules, policies, actions, and schedules — useful for "what alerts go to whom" audits.Query Analytics Events (
appd_query_analytics_events): Run ADQL queries against the AppDynamics Events Service, supporting single or multi-query batches (up to 20) and pagination.Get Dependency Map (
appd_get_dependency_map): Synthesize a tier-to-tier and tier-to-backend service dependency map by aggregating the application model and transaction snapshot exit calls.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@appd-mcp List business applications"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
appd-mcp
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-mcpis not affiliated with, endorsed by, sponsored by, or certified by Cisco Systems, Inc., Splunk LLC, or AppDynamics, LLC. SeeTRADEMARKS.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 hostv0.1.1 and earlier docs may say
pnpm setup. That name was renamed topnpm wizardin v0.1.2 becausesetupcollides with pnpm's built-in command (it configuresPNPM_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 |
| List business applications |
| Topology: business transactions, tiers, nodes, backends |
| Discover valid metric paths |
| Query metric-data-v2 with rollup + time range |
| Slow/error/diagnostic snapshots with optional exit calls |
| Active/recent health rule violations |
| Anomaly violations + suspected causes |
| Event timeline (deployments, errors, custom, etc.) |
| List/inspect health rule definitions |
| Composite: policies + actions + schedules + health-rules |
| ADQL queries against the Events Service |
| 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
AGENT_BOOTSTRAP.md — canonical onboarding document (architecture, tool catalog, conventions, decision log, open questions). New devs/agents start here.
CONTRIBUTING.md — dev setup, conventions, how to add a tool, PR expectations.
SECURITY.md — vulnerability disclosure policy.
CODE_OF_CONDUCT.md — Contributor Covenant v2.1.
TRADEMARKS.md — independence statement and third-party trademark disclaimers.
NOTICE and THIRD_PARTY_NOTICES.md — attribution for ported upstream code (the setup wizard ports from the Apache-2.0
spl-bridgeproject).docs/wizard-pty-validation/ — archived POSIX-only PTY harness for hand-iterating wizard prompts; not part of CI.
Setup wizard
pnpm wizard runs an interactive wizard that drops you into a
working install in five steps:
Prerequisites — checks Node version, that
dist/index.jsexists, and that.envis writable. Detects Cursor / Claude Desktop installations.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.
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 clusteron the Events probe degrades to SKIP (the tenant simply isn't entitled for Analytics) instead of failing the wizard.Persist — atomic-write
.envwith a timestamped.bak.<ISO>andchmod 0600. Pre-validates against the Zod runtime schema before writing.MCP host wiring — pick from
Cursor (project),Cursor (user), orPrint snippet only. The chosen target uses Cursor's nativeenvFilefield so no secrets land inmcp.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-probeManual 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 forappd_query_analytics_events.APPD_TIMEOUT_MS,APPD_LOG_LEVEL,APPD_TOOLS_ENABLED— tuning.
Then start the server directly:
node --env-file=.env dist/index.jsWiring into a host
Cursor (recommended path)
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:
Run
pnpm install && pnpm buildonce, and create.env(see Manual configuration).Restart Cursor (or reload the window).
Open Settings → Tools & MCP (Cmd+Shift+J → Features → Model Context Protocol). Toggle the
appdynamicsserver on.The 12
appd_*tools become available to the agent. The agent will ask for confirmation before invoking them by default;Output → MCP Logsis 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 integrationPer-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=trueexists 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 toolsappd_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.
Inputs: application (required). Returns: summary, evidence, entities, timeRange, +4 more
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[]).
Inputs: application (required), timeRange, fetchSuspectedCause, pageSize, +1 more. Returns: summary, evidence, entities, timeRange, +4 more
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.
Inputs: application (required), include. Returns: summary, evidence, entities, timeRange, +4 more
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).
Inputs: application (required), timeRange. Returns: summary, evidence, entities, timeRange, +4 more
appd_get_eventsGet AppDynamics eventsB
Retrieve up to 600 events for an application by type and severity within a time window.
Inputs: application (required), eventTypes (required), severities (required), timeRange. Returns: summary, evidence, entities, timeRange, +4 more
appd_get_health_rule_violationsGet AppDynamics health rule violationsA
Retrieve open / recently-closed health rule violations for an application within a time window.
Inputs: application (required), timeRange. Returns: summary, evidence, entities, timeRange, +4 more
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.
Inputs: application (required), metricPath. Returns: summary, evidence, entities, timeRange, +4 more
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.
Inputs: application (required), timeRange, businessTransactionIds, tierIds, +7 more. Returns: summary, evidence, entities, timeRange, +4 more
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).
Inputs: aliveWithinMinutes. Returns: summary, evidence, entities, timeRange, +4 more
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.
Inputs: application (required), expandDetails, maxDetailFanout. Returns: summary, evidence, entities, timeRange, +4 more
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.
Inputs: query, queries, timeRange, limit, +1 more. Returns: summary, evidence, entities, timeRange, +4 more
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.
Inputs: application (required), metricPaths (required), timeRange, rollup. Returns: summary, evidence, entities, timeRange, +4 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
Unofficial remote MCP server for Less Annoying CRM: OAuth 2.1, read-only grants, 10 tools.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Related MCP Servers
- AlicenseCqualityFmaintenanceA 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.1001,903 npm2MIT
- FlicenseCqualityDmaintenanceA read-only MCP server for the Cisco Meraki Dashboard API that exposes 50 GET endpoints for understanding network topology from organization down to individual devices and ports.50-
- AlicenseNot gradedqualityDmaintenanceA 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
- FlicenseCqualityCmaintenanceRead-only MCP server that collects Analytics data from the Meta Horizon developer dashboard by intercepting GraphQL queries. It provides tools for status checks, snapshot collection, and reading allowed query results.4-