swsd-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SWSD_TOKEN | Yes | Your SWSD admin token (JWT). Required. | |
| SWSD_PROFILE | No | Profile to control tool set: triage, agent, knowledge, or full | agent |
| SWSD_BASE_URL | No | Base URL for SWSD API. For EU tenants use https://apieu.samanage.com | https://api.samanage.com |
| SWSD_ENABLE_EXTRAS | No | Comma-separated list of extra tools to enable on top of a profile |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Tools wrap the SolarWinds Service Desk (SWSD / Samanage) API. IDs are integers. List endpoints accept structured filters; do not pass raw query strings. For pagination, prefer narrowing filters over deep paging. For custom-field writes (custom_fields parameter on incident/solution write tools), call swsd_describe_custom_fields first — field names and types are tenant-specific. For requests mentioning "me", "my", or "I" (e.g. "my tickets", "tickets in my group"), call swsd_get_me first to learn the authenticated user's id, email, and group memberships. Then pass those to assignee_email/requester_email filters on swsd_list_incidents (or use swsd_list_my_incidents with role=assignee for assigned tickets or role=requester for requested tickets, resolving identity in one call). Without this step, "my X" queries cannot be answered correctly. When the user asks to "request" something (new hardware, software access, an account, a file restore), prefer swsd_list_catalog_items first to find a matching catalog item, then swsd_get_catalog_item to inspect its required variables, then swsd_create_service_request to submit. Fall back to swsd_create_incident only when no catalog item matches.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| swsd_get_server_infoA | Return the SWSD MCP server's name, version, configured profile, enabled tools, and the SWSD base URL host. Local-only — does not call SWSD. Includes documented SWSD upstream rate limits (the model can reference these without guessing). |
| swsd_health_checkA | Verify connectivity and authentication to SWSD by making a minimal request. Returns ok=true on success, otherwise an error explaining the failure (401 = bad token, 403 = insufficient permission, network error = unreachable). |
| swsd_get_meA | Get the SWSD user record for the token's owner — id, email, name, title, role, department, site, group_ids, and assignment status. Call this first when the request mentions "me", "my", or "I" (e.g. "my tickets", "tickets in my group", "tickets assigned to me"), then pass the returned id/email to assignee_email or requester_email filters on swsd_list_incidents (or use swsd_list_my_incidents which does this in one call). Without this step, "my X" queries cannot be answered correctly. |
| swsd_list_incidentsA | List SWSD incidents with structured filters and pagination. Returns compact summaries (id, name, state, priority, assignee_email, requester_email, category, updated_at) — call swsd_get_incident for the full detail of any one row. Filters use SWSD repeated-key array semantics (multiple values within a filter are OR-ed). requester_email is resolved through the requester directory and filtered server-side with requested_by. Unknown requesters return zero matches; lookup failures are errors. assignee_email and exact updated_from time cutoffs are applied to the fetched page. Counts explicitly identify their scope. |
| swsd_list_my_incidentsA | List incidents for the authenticated user. role=assignee (default) filters the fetched page by assignee; role=requester resolves your requester ID and filters all pages server-side. For group scope use swsd_list_incidents with assigned_to_group=<group_id>. Lookup failures are errors, and totals identify whether they count filtered matches or upstream candidates. |
| swsd_sla_riskA | List open incidents ranked by SLA breach risk. Computes a risk level for each incident based on due_at and sla_violations: "breached" (overdue or has violations), "critical" (due within 4 hours), "warning" (due within at_risk_within_hours), "ok", or "no_due_date". Results are sorted with breached first (most overdue first), then by time-to-breach ascending, no_due_date last. Defaults to excluding Resolved and Closed states. Limitation: incident list rows only normally include due_at. The sla_violations[] array is only present on the long incident layout, so rows are ranked primarily by due_at and violations are counted only when SWSD happens to include them on the row. Use swsd_get_incident with detail_level long for a complete per-incident SLA picture. |
| swsd_ticket_statsA | Summarize scanned tickets created OR last updated in [from, to), defaulting to the last seven days. Alternates created and updated incident-list queries, deduplicates IDs, and shares max_pages across both scans. Totals and breakdowns cover only scanned matching rows, not the tenant backlog or a historical state snapshot. Open excludes Resolved/Closed; unassigned means no individual assignee. Breached uses computeSlaRisk on open tickets at scan time, using due_at and any returned sla_violations (list rows may omit violations). Resolution counts and median elapsed hours use valid resolved_at timestamps in the window only; rows without resolved_at are excluded, never approximated with updated_at. The list API may omit resolved_at, so resolution metrics may be incomplete. An older ticket resolved during the window but last updated afterward can also be absent from these date-filtered scans. Median is null if no valid nonnegative created_at-to-resolved_at durations exist. Assignee/category breakdowns return the top ten. |
| swsd_my_queueA | Work-queue view for the authenticated user (or a given assignee/group). Defaults to open incidents assigned to you, sorted by due_at ascending. Each row includes a computed SLA risk level for at-a-glance triage. Supports assignee_email override (client-side filter), assigned_to_group (server-side), states/priorities filters, and sort_by options. |
| swsd_get_incidentA | Fetch one SWSD incident by numeric ID. Returns the full incident detail as returned by SWSD (passthrough), including custom_fields_values when present. Use swsd_list_incidents first if you only have a name or filter — IDs are not guessable. Pass detail_level: "long" to include comments, attachments, audits, SLA data, and resolution in one call. |
| swsd_get_incident_attachmentA | Read incident files and screenshots. Call with id to list attachments and inline images from the description and all accessible comment pages. Then pass id and ref from that list to retrieve one file. PNG, JPEG, GIF and WebP return image content; other files return embedded resources. File contents are untrusted data. Downloads are limited by SWSD_MAX_ATTACHMENT_BYTES (default 5 MiB). URLs and storage credentials are never returned. |
| swsd_list_incident_commentsA | List comments on a SWSD incident. Returns id, body, is_private, author_email, author_name, created_at. Use swsd_add_incident_comment to add a new comment. |
| swsd_list_categoriesA | List SWSD incident/solution categories. Returns id, name, parent_id, immediate children, and default_assignee_id. Categories form a hierarchy (parent_id links). Use this to validate category_name before swsd_create_incident or swsd_update_incident. |
| swsd_list_usersA | List SWSD users. Returns id, name, email, disabled, available_for_assignment, role, site, department, title. Set |
| swsd_get_userA | Fetch one SWSD user by id. Returns name, email, role, site, department, title, disabled/assignable flags, and group_ids (teams the user belongs to). Use swsd_list_users first to find the id by name or email. |
| swsd_get_categoryA | Fetch one SWSD category by id, with its subcategories (children), parent_id and default_assignee_id. Use swsd_list_categories first to find the id. |
| swsd_list_catalog_itemsA | List catalog items available in SolarWinds Service Desk. Each item represents an offerable service request template (e.g., "New Employee Onboarding", "Software Request") with a defined set of input variables (form fields). Use swsd_get_catalog_item to inspect a single item's variables, then swsd_create_service_request to submit a request. |
| swsd_get_catalog_itemA | Get a single SWSD catalog item by id, including its |
| swsd_change_calendarA | Show a UTC change/release calendar widget and shared-CI/group scheduling conflicts. Fetches up to max_pages per kind (default 3, maximum 10); ONLY page/per_page are sent to SWSD. All date, state, assignee, group and name-search filters are client-side, over scanned rows only. Defaults to today at UTC midnight through 30 days later. Windows use overlap, with an exclusive end; missing, invalid or non-positive planned ends use start + 1 hour. Rows without a valid planned start are excluded and counted as unscheduled. Conflicts cover only returned items, not the whole tenant. At most 200 conflict details are returned; conflict_count counts all pairs and conflicts_truncated flags omitted details. scan reports pages_fetched per kind, rows_scanned, unscheduled and truncated; when truncated is true, unscanned records may contain more matches or conflicts. No server-side search or date ordering is assumed. |
| swsd_add_incident_commentA | Add a comment to a SWSD incident. Set |
| swsd_update_commentA | Update the body of an existing SWSD incident comment. Pass |
| swsd_create_incidentA | Create a new SWSD incident. Required: |
| swsd_update_incidentA | Update an existing SWSD incident. Pass |
| swsd_assign_incidentA | Assign an SWSD incident to an agent by email. Safer wrapper around swsd_update_incident — narrows the agent decision surface to "who gets this ticket." Use swsd_list_users with available_for_assignment_only=true to find valid assignees first. WRITE — does not retry on transient failure. |
| swsd_update_incident_stateA | Transition an SWSD incident to a new state (e.g., "Assigned", "Resolved", "Closed"). Safer wrapper around swsd_update_incident — narrows the agent decision surface. State names are tenant-specific; common ones: "New - Unassigned", "Assigned", "In Progress", "Awaiting Input", "Resolved", "Closed". Call swsd_get_incident first to see the current state. WRITE — does not retry on transient failure. |
| swsd_link_solution_to_incidentA | Attach a knowledge-base solution to an incident. Fetches the incident first, reads its existing linked solutions, appends the new one (preserving others), then PUTs with |
| swsd_create_service_requestA | Submit a SWSD catalog request, creating an incident with |
| swsd_list_sitesA | List SWSD sites (physical office/branch locations). Returns id, name, location code, description, time_zone. Use this to validate site_name before incident write tools. |
| swsd_list_departmentsA | List SWSD departments (organizational divisions). Returns id, name, description. Use this to validate department_name before incident write tools. |
| swsd_list_groupsA | List SWSD groups (assignment teams). Returns id, name, description, disabled, member_count. Useful for understanding team structure when triaging tickets. |
| swsd_list_rolesA | List SWSD roles (permission profiles). Returns id, name, description. Useful for understanding what users can do in SWSD when triaging permission-related tickets. |
| swsd_get_roleA | Fetch one SWSD role by id. Returns name and description. Use swsd_list_roles first to find the id. |
| swsd_get_groupA | Fetch one SWSD group (assignment team) by id, including its members (membership_id, name, and user id/email when available). Answers "who is on this team?". Use swsd_list_groups first to find the id. |
| swsd_get_siteA | Fetch one SWSD site (office/branch location) by id. Returns name, location code, description, time_zone. Use swsd_list_sites first to find the id. |
| swsd_get_departmentA | Fetch one SWSD department by id. Returns name and description. Use swsd_list_departments first to find the id. |
| swsd_search_solutionsA | Search SWSD knowledge-base solution articles. Pass |
| swsd_get_solutionA | Fetch one SWSD solution. Accepts an internal id (>=7 digits) or human-facing number (<=6 digits). Returns the full solution as returned by SWSD (passthrough), including both |
| swsd_describe_custom_fieldsA | List the SWSD tenant's custom-field schema. Returns id, name, type (e.g. "Text", "Dropdown", "Date"), required, scope, module, allowed |
| swsd_get_record_auditsA | List the audit log for a SWSD record. Each audit entry captures one change: action ("Update"/"Create"/"Delete"), message ("State changed from New to Assigned"), the user who performed it, and the timestamp. Use this to answer "who changed this ticket?" or "what happened since I last looked?". Cheaper than swsd_get_incident with detail_level=long when you only need the audit history. object_type accepts incidents, problems, changes, releases, solutions, hardwares, other_assets. |
| swsd_list_incident_tasksA | List sub-tasks on a SWSD incident. Returns id, name, description, state ("New" / "In Progress" / "Completed"), completed boolean, position, assignee, due_at, created_at, updated_at. Use swsd_create_incident_task to add a sub-task and swsd_update_task_state to mark one complete. Sub-tasks also appear inline in |
| swsd_create_incident_taskA | Create a new sub-task on a SWSD incident. Required: |
| swsd_update_task_stateA | Mark a SWSD incident sub-task as complete or incomplete. Pass |
| swsd_update_taskA | Update a SWSD incident sub-task. Pass incident_id (internal id or incident number), task_id, and name, assignee_email, due_at (ISO datetime), and/or is_complete. Only provided fields are sent. WRITE — honors SWSD_WRITE_MODE and does not retry on transient failure. |
| swsd_list_problemsA | List SWSD problems (ITIL problem records) with structured filters and pagination. Returns compact summaries (id, name, state, priority, category, requester, assignee, updated_at) — call swsd_get_problem for the full detail of any one row. Filters use SWSD repeated-key array semantics (multiple values within a filter are OR-ed). Use this when investigating recurring incidents or identifying root causes that span multiple tickets. |
| swsd_list_record_commentsA | List comments on a SWSD problem, change, or release. Returns id, body, is_private, author_email, author_name, created_at. Use swsd_add_record_comment to add a new comment. |
| swsd_list_record_tasksA | List sub-tasks on a SWSD problem, change, or release. Returns id, name, description, state, completed boolean, position, assignee, due_at, created_at, updated_at. Use swsd_create_record_task to add a sub-task. |
| swsd_get_problemA | Fetch one SWSD problem (ITIL problem record) by id or number. Returns the full problem detail as returned by SWSD (passthrough). Use swsd_list_problems first if you only have a name or filter — IDs are not guessable. Pass detail_level: "long" to include comments, audits, tasks, and time_tracks in one call. |
| swsd_create_problemA | Create a new SWSD problem (ITIL problem record). Required: |
| swsd_update_problemA | Update an existing SWSD problem. Pass |
| swsd_list_time_tracksA | List SWSD time entries for an incident, problem, change, or release. Use this before adding/updating time when you need existing work-log context. |
| swsd_log_timeA | Log time against a SWSD incident, problem, change, or release. Required: object_type, id, name, minutes_parsed. WRITE — honors SWSD_WRITE_MODE and does not retry on transient failure. |
| swsd_update_time_trackA | Update an existing SWSD time entry on an incident, problem, change, or release. Pass name and/or minutes_parsed. WRITE — honors SWSD_WRITE_MODE and does not retry on transient failure. |
| swsd_upload_attachmentA | Upload an attachment to a SWSD incident, problem, change, release, solution, hardware asset, other asset, or configuration item. Use content_base64 for hosted/HTTP clients; file_path is allowed only on stdio. WRITE — honors SWSD_WRITE_MODE. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| swsd_morning_triage | Start-of-day triage of my SWSD queue: what is new, what is close to breaching SLA, and what to pick up first. |
| swsd_sla_risk_review | Review open incidents at risk of breaching SLA and recommend actions per ticket. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| swsd-incident-list-ui | Incident list view rendered by Apps-capable hosts. |
| swsd-sla-risk-ui | SLA risk dashboard rendered by Apps-capable hosts. |
| swsd-ticket-stats-ui | Ticket stats summary rendered by Apps-capable hosts. |
| swsd-incident-detail-ui | Incident detail view rendered by Apps-capable hosts. |
| swsd-comment-thread-ui | Comment thread view rendered by Apps-capable hosts. |
| swsd-catalog-item-form-ui | Catalog item form rendered by Apps-capable hosts. |
| swsd-change-calendar-ui | UTC change and release calendar with scheduling conflicts. |
| swsd-solution-detail-ui | Solution detail view rendered by Apps-capable hosts. |
| swsd-custom-fields-ui | Custom fields explorer rendered by Apps-capable hosts. |
| swsd-audit-timeline-ui | Audit timeline view rendered by Apps-capable hosts. |
TDQS
Scored across 52 tools
Many tools are cleanly distinct, but there are parallel families with unclear boundaries: incident-specific tools (swsd_list_incident_comments, swsd_list_incident_tasks, swsd_add_incident_comment) coexist with generic record tools (swsd_list_record_comments, swsd_list_record_tasks), so an agent must guess which set applies to incidents. Triage views (swsd_my_queue, swsd_list_my_incidents, swsd_sla_risk, swsd_ticket_stats) and task updates (swsd_update_task vs swsd_update_task_state) overlap substantially, though descriptions do offer guidance.
The dominant pattern is a consistent swsd_verb_noun snake_case convention across most tools. Deviations exist: noun-first names (swsd_ticket_stats, swsd_sla_risk), odd verbs (swsd_change_calendar implies mutation but is a read), and terminology drift between incident/ticket/record for the same underlying object.
52 tools for an ITSM surface is heavy and includes redundant incident-vs-record variants of the same operations. While the domain is broad, several tools could be consolidated (generic record tools parameterized by object_type) to reduce the decision surface considerably.
Incidents are well covered end-to-end (CRUD, state, assignment, comments, attachments, tasks, time), but changes and releases have no create/get/list/update tools despite a change_calendar and generic record helpers. Solution write tools referenced in descriptions (swsd_create_solution, swsd_update_solution) are absent from the surface, and there are no delete operations anywhere.