{
  "markdown": "# Atera MCP Server\n\nModel Context Protocol (MCP) server for interacting with the Atera RMM API. Implements a decision tree architecture for efficient tool discovery and reduced context overhead.\n\n\n## One-Click Deployment\n\n> [!IMPORTANT]\n> **Before you click:** this server depends on `@wyre-technology/node-atera`,\n> which is hosted on the **GitHub Packages** npm registry. GitHub Packages has no\n> anonymous access — even though the package is public, every `npm install` needs a\n> token. The cloud builder runs `npm install` for you, so you must give it one, or\n> the build fails with `npm error 401 Unauthorized ... npm.pkg.github.com`.\n>\n> 1. Create a GitHub **Personal Access Token** with the `read:packages` scope\n>    ([classic token](https://github.com/settings/tokens/new?scopes=read:packages&description=atera-mcp%20deploy)).\n>    Any GitHub account works — you do **not** need to be a member of the\n>    `WYRE-AI` org to read its public packages.\n> 2. Add it as a build variable when prompted by the deploy flow:\n>    - **Cloudflare Workers** → set a build variable named **`NODE_AUTH_TOKEN`** to your PAT\n>      (Workers → Settings → Build → Variables and Secrets).\n>    - **DigitalOcean App Platform** → set an encrypted env var named **`GITHUB_TOKEN`**\n>      with scope **Build Time** to your PAT (the `.do/app.yaml` already declares it).\n\n[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/WYRE-AI/atera-mcp/tree/main)\n\n[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/WYRE-AI/atera-mcp)\n\n> [!NOTE]\n> The DigitalOcean target builds the full Docker image and runs the complete MCP\n> server over HTTP — this is the recommended path for operators. The Cloudflare\n> Workers target is currently a thin entrypoint stub (the `/mcp` route returns\n> `501 Not Implemented`) and is best suited to gateway-style deployments; for a\n> full self-hosted server prefer DigitalOcean or the prebuilt container image\n> (`ghcr.io/wyre-ai/atera-mcp`).\n\n## Features\n\n- **Decision Tree Navigation**: Tools are organized by domain (customers, agents, tickets, alerts, contacts). Navigate to a domain first, then use domain-specific tools.\n- **Lazy Client Loading**: The Atera client is only instantiated when first needed, reducing startup time.\n- **Full API Coverage**: Supports customer management, device/agent monitoring, ticket operations, alert handling, and contact management.\n- **Rate Limit Handling**: Built-in rate limiting via the node-atera client (700 req/min).\n- **Interactive Ticket Card (MCP Apps)**: `atera_tickets_get` renders as an interactive card in MCP Apps hosts (Claude Desktop/web) with an in-card \"Add comment\" round-trip via `atera_tickets_add_comment` (internal-only by default); plain-JSON behavior is unchanged in other hosts. The card is neutral by default and brandable via `window.__BRAND__` injection or `MCP_BRAND_*` env vars (`MCP_BRAND_NAME`, `MCP_BRAND_LOGO_URL`, `MCP_BRAND_PRIMARY_COLOR`, `MCP_BRAND_ACCENT_COLOR`, `MCP_BRAND_BG`, `MCP_BRAND_TEXT`) — no rebuild needed.\n\n## Installation\n\nThis package is published to the **GitHub Packages** npm registry, which requires a\ntoken even for public packages. Authenticate once, then install:\n\n```bash\n# Authenticate npm to GitHub Packages (token needs the read:packages scope)\nexport NODE_AUTH_TOKEN=$(gh auth token)   # or a PAT with read:packages\n\nnpm install @wyre-ai/atera-mcp\n```\n\nThe repo's `.npmrc` already points the `@wyre-ai` scope at GitHub Packages and\nreads the token from `NODE_AUTH_TOKEN`, so no further config is needed.\n\nOr build from source:\n\n```bash\ngit clone https://github.com/WYRE-AI/atera-mcp.git\ncd atera-mcp\nnpm install\nnpm run build\n```\n\n## Configuration\n\nSet the following environment variable:\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `ATERA_API_KEY` | Yes | Your Atera API key from Admin > API |\n\n### Getting Your API Key\n\n1. Log into Atera as an admin\n2. Go to **Admin** > **API**\n3. Generate or copy your API key\n\n## Usage\n\n### With Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"atera\": {\n      \"command\": \"npx\",\n      \"args\": [\"@wyre-ai/atera-mcp\"],\n      \"env\": {\n        \"ATERA_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### With MCP Gateway\n\nConfigure in the gateway registry:\n\n```json\n{\n  \"name\": \"atera-mcp\",\n  \"command\": \"node\",\n  \"args\": [\"/path/to/atera-mcp/dist/index.js\"],\n  \"env\": {\n    \"ATERA_API_KEY\": \"${ATERA_API_KEY}\"\n  }\n}\n```\n\n### Docker\n\n```bash\ndocker build -t atera-mcp .\ndocker run -e ATERA_API_KEY=your-key atera-mcp\n```\n\n## Decision Tree Architecture\n\nThis server uses a navigation-based approach to tool discovery:\n\n1. **Start**: Only `atera_navigate` tool is available\n2. **Navigate**: Call `atera_navigate` with a domain (customers, agents, tickets, alerts, contacts)\n3. **Domain Tools**: After navigation, domain-specific tools become available\n4. **Back**: Use `atera_back` to return to domain selection\n\nThis architecture:\n- Reduces tool list size for better LLM performance\n- Groups related operations logically\n- Minimizes context window usage\n\n## Available Domains\n\n### Customers\nManage customer (company) records.\n- `atera_customers_list` - List customers with pagination\n- `atera_customers_get` - Get customer by ID\n- `atera_customers_create` - Create new customer\n\n### Agents\nManage devices/endpoints with the Atera agent installed.\n- `atera_agents_list` - List agents with optional customer filter\n- `atera_agents_get` - Get agent by ID\n- `atera_agents_get_by_machine` - Get agent by machine name\n\n### Tickets\nManage service tickets.\n- `atera_tickets_list` - List tickets with filters\n- `atera_tickets_get` - Get ticket by ID\n- `atera_tickets_create` - Create new ticket\n- `atera_tickets_update` - Update existing ticket\n\n### Alerts\nMonitor alerts from devices and agents.\n- `atera_alerts_list` - List alerts with filters\n- `atera_alerts_get` - Get alert by ID\n- `atera_alerts_by_agent` - List alerts for an agent\n- `atera_alerts_by_device` - List alerts for a device\n\n### Contacts\nManage customer contacts.\n- `atera_contacts_list` - List all contacts\n- `atera_contacts_get` - Get contact by ID\n- `atera_contacts_by_customer` - List contacts for a customer\n\n## Example Conversation\n\n```\nUser: List all open tickets\n\nClaude: I'll navigate to the tickets domain and list open tickets.\n[Calls atera_navigate with domain: \"tickets\"]\n[Calls atera_tickets_list with ticketStatus: \"Open\"]\n\nResult: Found 15 open tickets...\n```\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Run in development\nnpm run dev\n\n# Type check\nnpm run typecheck\n\n# Lint\nnpm run lint\n\n# Test\nnpm run test\n```\n\n## API Rate Limits\n\nAtera API allows 700 requests per minute. The underlying node-atera client handles rate limiting automatically with request queuing.\n\n## License\n\nApache-2.0\n\n## Contributing\n\nContributions welcome! Please read our contributing guidelines and submit PRs to the main branch.\n",
  "bytes": 7119,
  "sha": "050c6209caa4fdd2edc0aa81c29d464dd5e4308df84857645cb64bc852cd9225",
  "repo_slug": "wyre-technology/atera-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_wyre_technology_atera_mcp_9519abc3/readme"
}