{
  "markdown": "<!-- mcp-name: io.github.shigechika/aruba-central-mcp -->\n\n# aruba-central-mcp\n\nEnglish | [日本語](README.ja.md)\n\nMCP server for [Aruba Central](https://www.arubanetworks.com/products/network-management-operations/central/) (GreenLake New Central API).\n\nExposes access point, switch, and wireless client status to MCP-compatible AI assistants (Claude Code, Claude Desktop, etc.) via STDIO transport.\n\nDocumentation: <https://shigechika.github.io/aruba-central-mcp/>\n\n## Features\n\n### Access Points\n\n| Tool | Description |\n|------|-------------|\n| `list_aps` | List all access points (with optional site/status filter) |\n| `list_radios` | List AP radios (channel, utilization, noise floor, TX power) |\n| `list_bssids` | List all BSSIDs |\n| `list_wlans` | List WLANs (SSID, security, VLAN) |\n| `list_swarms` | List AP swarms/clusters |\n| `get_ap_status` | Get detailed status of a specific AP |\n| `get_ap_throughput` | Get AP throughput trend (TX/RX over time) |\n| `get_top_aps` | Top APs by bandwidth usage (wireless/wired/total) |\n\n### Clients\n\n| Tool | Description |\n|------|-------------|\n| `list_clients` | List connected wireless clients (with optional SSID/band filter) |\n| `find_client_by_mac` | Find a client by MAC address (direct API lookup) |\n| `get_clients_trend` | Client count trend over time |\n| `get_top_clients_by_usage` | Top clients by bandwidth usage |\n| `get_client_mobility_trail` | Client roaming history |\n\n### Infrastructure\n\n| Tool | Description |\n|------|-------------|\n| `list_switches` | List all switches |\n| `get_site_summary` | Aggregated site-level summary (AP counts, client counts) |\n| `health_check` | Report server version and verify Aruba Central authentication (no data fetch) |\n\n### Highlights\n\n- **Server-side OData filtering** for efficient queries\n- **OAuth2 Client Credentials** authentication (GreenLake SSO)\n- **Automatic pagination** for large result sets\n- **Token auto-refresh** before expiration\n- Lightweight: only `mcp` SDK + `httpx` (no pandas)\n\n## Prerequisites\n\n- Python 3.10+\n- Aruba Central account with API access (GreenLake New Central API)\n- OAuth2 client credentials (client ID and secret)\n\n## Setup\n\n```bash\n# uv\nuv pip install aruba-central-mcp\n\n# pip\npip install aruba-central-mcp\n```\n\nOr run without installing:\n\n```bash\nuvx aruba-central-mcp\n```\n\nFrom source:\n\n```bash\ngit clone https://github.com/shigechika/aruba-central-mcp.git\ncd aruba-central-mcp\n\n# uv\nuv sync\n\n# pip\npip install -e .\n```\n\n## Configuration\n\nSet the following environment variables:\n\n| Variable | Description | Example |\n|---|---|---|\n| `ARUBA_CENTRAL_BASE_URL` | API gateway URL | `apigw-uswest4.central.arubanetworks.com` |\n| `ARUBA_CENTRAL_CLIENT_ID` | OAuth2 client ID | `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` |\n| `ARUBA_CENTRAL_CLIENT_SECRET` | OAuth2 client secret | `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` |\n\n### How to obtain API credentials\n\n1. Log in to [HPE GreenLake Platform](https://common.cloud.hpe.com/)\n2. Go to **Manage Workspace** > **Personal API clients**\n3. Click **Create Personal API client**\n4. Enter a nickname and select **Aruba Central** as the service\n5. Copy the `client_id` and `client_secret` — **the secret is shown only once**\n\nFor details, see:\n- [OAuth APIs for Access Token](https://developer.arubanetworks.com/hpe-aruba-networking-central/docs/api-oauth-access-token)\n- [Making API Calls](https://developer.arubanetworks.com/new-central/docs/making-api-calls)\n\n## Usage\n\n### Claude Code (plugin)\n\nThis repository doubles as a single-plugin marketplace, so Claude Code can install\nthe server for you:\n\n```\n/plugin marketplace add shigechika/aruba-central-mcp\n/plugin install aruba-central-mcp@aruba-central-mcp\n```\n\nThe plugin launches `uvx aruba-central-mcp` and reads the same three environment\nvariables described in [Configuration](#configuration); export them before\nstarting Claude Code.\n\n`uvx` must be on the `PATH` of the process that runs Claude Code — a login\nshell usually has it, but a GUI-launched app may not; install\n[uv](https://docs.astral.sh/uv/) system-wide if the plugin fails to start.\n\n### Claude Code (manual)\n\n```bash\nclaude mcp add aruba-central \\\n  -e ARUBA_CENTRAL_BASE_URL=apigw-uswest4.central.arubanetworks.com \\\n  -e ARUBA_CENTRAL_CLIENT_ID=your-client-id \\\n  -e ARUBA_CENTRAL_CLIENT_SECRET=your-client-secret \\\n  -- uvx aruba-central-mcp\n```\n\nOr add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"aruba-central\": {\n      \"command\": \"uvx\",\n      \"args\": [\"aruba-central-mcp\"],\n      \"env\": {\n        \"ARUBA_CENTRAL_BASE_URL\": \"apigw-uswest4.central.arubanetworks.com\",\n        \"ARUBA_CENTRAL_CLIENT_ID\": \"your-client-id\",\n        \"ARUBA_CENTRAL_CLIENT_SECRET\": \"your-client-secret\"\n      }\n    }\n  }\n}\n```\n\n### Claude Desktop\n\nAdd to `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"aruba-central\": {\n      \"command\": \"uvx\",\n      \"args\": [\"aruba-central-mcp\"],\n      \"env\": {\n        \"ARUBA_CENTRAL_BASE_URL\": \"apigw-uswest4.central.arubanetworks.com\",\n        \"ARUBA_CENTRAL_CLIENT_ID\": \"your-client-id\",\n        \"ARUBA_CENTRAL_CLIENT_SECRET\": \"your-client-secret\"\n      }\n    }\n  }\n}\n```\n\n### Direct execution\n\n```bash\nexport ARUBA_CENTRAL_BASE_URL=\"apigw-uswest4.central.arubanetworks.com\"\nexport ARUBA_CENTRAL_CLIENT_ID=\"your-client-id\"\nexport ARUBA_CENTRAL_CLIENT_SECRET=\"your-client-secret\"\npython3 -m aruba_central_mcp\n```\n\n### CLI Options\n\n```bash\naruba-central-mcp --version   # Print version and exit\naruba-central-mcp --help      # Show usage and required environment variables\naruba-central-mcp --check     # Verify environment variables and OAuth2 authentication, then exit\naruba-central-mcp             # Start MCP server (STDIO, default)\n```\n\nWith no options, the process runs as an MCP STDIO server (the mode used by MCP clients).\n\n`--check` exit codes: `0` success, `1` config error, `2` auth error.\n\n## Development\n\n```bash\ngit clone https://github.com/shigechika/aruba-central-mcp.git\ncd aruba-central-mcp\n\n# uv\nuv sync --dev\nuv run pytest -v\n\n# pip\npython3 -m venv .venv\n.venv/bin/pip install -e \".[test]\"\n.venv/bin/pytest -v\n```\n\n### Live smoke test\n\nThe unit suite mocks Central at the transport layer, which is what makes it\nfast — and also what makes it blind to a tool that has stopped returning real\ndata. `scripts/smoke_test.py` runs **every registered tool** against the\nconfigured tenant and fails on empty, malformed or error answers:\n\n```bash\n# needs the same ARUBA_CENTRAL_* environment variables as the server\nuv run python scripts/smoke_test.py\nuv run python scripts/smoke_test.py --only radios --traceback\n```\n\n- **Read-only.** Every tool here reads; nothing in Central is configured. A\n  future tool that writes must be listed as state-changing and skipped, and a\n  test enforces that.\n- **No payloads in the report.** Tool names, statuses and row counts only;\n  error text is redacted too, since an error routinely quotes the device,\n  client MAC or site it was asked about.\n- **Nothing network-specific in the specs.** The AP, the serial number and the\n  client MAC that the per-device tools need are discovered at run time from the\n  listings, and skipped when the network has none to offer. Two tests keep it\n  that way: one refuses those parameters as literals, the other bans anything\n  address-shaped anywhere in the file, because this repository is public.\n- Empty answers pass for the listings and the time-series tools — a site with\n  no swarms configured is a real deployment — but a *lookup* handed a name\n  discovered seconds earlier must not come back empty, and those probes say so.\n- CI enforces the cheap half: a tool registered without a probe spec fails the\n  build (`tests/test_smoke_probes.py`), so adding a tool forces the question\n  \"how would we know it works?\".\n- `scripts/smoke_harness.py` is the engine and holds no Central knowledge: it\n  is kept identical across the servers that share it, so fix engine bugs once\n  and sync the file rather than patching this copy.\n\nIts first run found a real one: `get_client_mobility_trail` was requesting a\npage size the endpoint rejects, so the tool had been failing for every client.\n\n## API Reference\n\nThis server uses the [GreenLake New Central API](https://developer.arubanetworks.com/):\n\n- `/network-monitoring/v1/aps` — Access points\n- `/network-monitoring/v1/radios` — AP radios\n- `/network-monitoring/v1/bssids` — BSSIDs\n- `/network-monitoring/v1/wlans` — WLANs\n- `/network-monitoring/v1/swarms` — AP swarms/clusters\n- `/network-monitoring/v1/switches` — Switches\n- `/network-monitoring/v1/clients` — Clients\n- `/network-monitoring/v1/clients-trend` — Client count trends\n- `/network-monitoring/v1/clients-topn-usage` — Top clients by usage\n- `/network-monitoring/v1/top-aps-by-usage` — Top APs by usage\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 8758,
  "sha": "dedf7d2e5c87623bee791d352929f23c5c7583b244985984c3f0a2fd5025cdaa",
  "repo_slug": "shigechika/aruba-central-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_shigechika_aruba_central_mcp_f9084c67/readme"
}