Atera MCP by usefulapi
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Check devices, alerts and tickets in Atera, and open tickets, comment or resolve alerts.
| Author | io.usefulapi |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 377 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Atera MCP by usefulapi": {
"url": "https://atera.usefulapi.io/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (20)
atera_get_accountread-onlyFetch the Atera account this key belongs to — company name, plan, country and timezone. A cheap way to confirm the key works. Atera: GET /api/v3/account.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_customersread-onlyList the customers (client companies) managed in Atera, paginated. Atera: GET /api/v3/customers.
Parameters:
page— integer — Page number, 1-based (default 1).items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_get_customerread-onlyFetch a single customer by id — address, domain, phone, notes. Atera: GET /api/v3/customers/{customerId}.
Parameters:
customer_id(required) — integer — The customer's CustomerID.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_agentsread-onlyList Atera agents — the managed machines — with online status, last seen, OS, hardware and logged-in user. Pass customer_id to list only one customer's devices. Atera: GET /api/v3/agents or GET /api/v3/agents/customer/{customerId}.
Parameters:
page— integer — Page number, 1-based (default 1).customer_id— integer — Only this customer's agents.items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_get_agentread-onlyFetch a single agent by its AgentID — full device inventory, online status, IPs, OS build and last reboot. Atera: GET /api/v3/agents/{agentId}.
Parameters:
agent_id(required) — integer — The agent's AgentID.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_find_agents_by_machineread-onlyFind the agent(s) installed on a machine by its machine name, e.g. DESKTOP-4F2K9. Atera: GET /api/v3/agents/machine/{machineName}.
Parameters:
machine_name(required) — string — The machine (computer) name.page— integer — Page number, 1-based (default 1).items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_get_agent_patchesread-onlyList the Windows/OS patches on one device — either those still AVAILABLE (missing) or those already INSTALLED. Takes the device's DeviceGuid (from atera_list_agents / atera_get_agent), not the AgentID. Atera: GET /api/v3/agents/{deviceGuid}/available-patches or /installed-patches.
Parameters:
device_guid(required) — string — The device's DeviceGuid.kind— string — available = patches not yet installed (default); installed = patch history.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_alertsread-onlyList monitoring alerts (disk, CPU, availability, hardware...) with severity, device, customer and linked ticket. Filter by status. Atera: GET /api/v3/alerts.
Parameters:
page— integer — Page number, 1-based (default 1).alert_status— string — Only alerts in this state.items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_ticketsread-onlyList helpdesk tickets with priority, status, type, end user, technician, SLA durations and last comments. Filter by customer and/or status. Atera: GET /api/v3/tickets.
Parameters:
page— integer — Page number, 1-based (default 1).customer_id— integer — Only this customer's tickets.items_in_page— integer — Items per page, 1-50 (default 20).ticket_status— string — Ticket status name, e.g. Open, Pending, Resolved or Closed (or a custom status).include_relations— boolean — Include parent/child ticket relation info.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_get_ticketread-onlyFetch a single ticket by its TicketID. Atera: GET /api/v3/tickets/{ticketId}.
Parameters:
ticket_id(required) — integer — The ticket's TicketID.include_relations— boolean — Include parent/child ticket relation info.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_ticket_commentsread-onlyList the comment thread on one ticket — end-user and technician replies, with internal notes flagged. Atera: GET /api/v3/tickets/{ticketId}/comments.
Parameters:
ticket_id(required) — integer — The ticket's TicketID.page— integer — Page number, 1-based (default 1).items_in_page— integer — Items per page, 1-50 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_ticket_work_hoursread-onlyList the time entries logged on one ticket — technician, start/end, billable, on-site, rate. Atera: GET /api/v3/tickets/{ticketId}/workhoursrecords.
Parameters:
ticket_id(required) — integer — The ticket's TicketID.page— integer — Page number, 1-based (default 1).items_in_page— integer — Items per page, 1-50 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_contactsread-onlyList end-user contacts, optionally searching by whole or partial email or phone number. Atera: GET /api/v3/contacts.
Parameters:
page— integer — Page number, 1-based (default 1).email— string — Whole or partial email to match.phone— string — Whole or partial phone number to match.items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_contractsread-onlyList service contracts (retainer, block hours, hourly, remote monitoring...) with their rates and billing periods. Pass customer_id for one customer's contracts. Atera: GET /api/v3/contracts or GET /api/v3/contracts/customer/{customerId}.
Parameters:
page— integer — Page number, 1-based (default 1).customer_id— integer — Only this customer's contracts.items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_list_kb_articlesread-onlyList knowledge-base articles with their product, keywords, section, category and ratings. Atera: GET /api/v3/knowledgebases.
Parameters:
page— integer — Page number, 1-based (default 1).items_in_page— integer — Items per page, 1-500 (default 20).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world not declared
atera_create_ticketdestructiveOpen a new helpdesk ticket. Give either end_user_id (an existing contact's EndUserID) or all of end_user_first_name, end_user_last_name and end_user_email to create a new contact with it. Atera: POST /api/v3/tickets.
Parameters:
title(required) — string — Ticket title.description(required) — string — Ticket description (first comment).type— stringimpact— stringstatus— string — Ticket status name, e.g. Open, Pending, Resolved or Closed (or a custom status).priority— stringend_user_id— integer — Existing contact's EndUserID.end_user_email— string — New contact's email.end_user_phone— string — New contact's phone.technician_email— string — Assign to the technician with this email.end_user_last_name— string — New contact's last name.end_user_first_name— string — New contact's first name.technician_contact_id— integer — Assign to this technician (TechnicianContactID).
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
atera_update_ticketdestructiveChange a ticket's title, status, type, priority, impact or assigned technician. Only the fields you pass are sent. Atera: PUT /api/v3/tickets/{ticketId}.
Parameters:
ticket_id(required) — integer — The ticket's TicketID.type— stringtitle— string — New title.impact— stringstatus— string — Ticket status name, e.g. Open, Pending, Resolved or Closed (or a custom status).priority— stringtechnician_email— string — Reassign to the technician with this email.technician_contact_id— integer — Reassign to this technician (TechnicianContactID).
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
atera_add_ticket_commentdestructiveAdd a comment to a ticket, either as a technician (technician_id, with is_internal=true for a private note or false for a reply the end user sees) or on behalf of an end user (enduser_id). Atera: POST /api/v3/tickets/{ticketId}/comments.
Parameters:
ticket_id(required) — integer — The ticket's TicketID.comment(required) — string — The comment text.enduser_id— integer — Post as this end-user contact (EndUserID).is_internal— boolean — Technician comments only: true = internal note (default), false = visible reply.technician_id— integer — Post as this technician (TechnicianId).timestamp_utc— string — Comment time in UTC, ISO 8601. Defaults to now.technician_email— string — The technician's email (optional, with technician_id).
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
atera_create_contactdestructiveCreate a new end-user contact under an existing customer (give customer_id or customer_name). Atera: POST /api/v3/contacts.
Parameters:
email(required) — string — The contact's email (required).phone— stringjob_title— stringlast_name— stringfirst_name— stringcustomer_id— integer — The customer's CustomerID.mobile_phone— stringcustomer_name— string — The customer's name, if you don't have the id.is_contact_person— boolean — Mark as the customer's primary contact person.
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
atera_resolve_alertdestructiveMark one monitoring alert as resolved. If the underlying condition persists, Atera raises it again on the next check. Atera: PUT /api/v3/alerts/{alertId}.
Parameters:
alert_id(required) — integer — The alert's AlertID.
Hints: read-only not declared · destructive yes · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.