{
  "markdown": "# SuperOps.ai MCP Server\n\nMCP server for Claude that provides tools to interact with the SuperOps.ai PSA/RMM platform using their GraphQL API.\n\n## One-Click Deployment\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/superops-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/superops-mcp)\n\n> **Operator note — GitHub Packages authentication.** This package is published\n> to the `@wyre-ai` scope on **GitHub Packages**, which requires an\n> authentication token on every install (GitHub Packages has no anonymous reads,\n> even for public packages). Create a GitHub **Personal Access Token** with the\n> `read:packages` scope and supply it to the cloud builder:\n>\n> - **Cloudflare Workers** — set a build variable named `NODE_AUTH_TOKEN` to your PAT.\n> - **DigitalOcean App Platform** — set a **build-time** secret named `GITHUB_TOKEN` to your PAT.\n>\n> For local installs, run `export NODE_AUTH_TOKEN=$(gh auth token)` before `npm install`.\n\n## Features\n\n- **Decision Tree Architecture**: Navigate to domains (clients, tickets, assets, technicians) to see relevant tools\n- **Lazy Loading**: Domain modules load on-demand for faster startup\n- **Full CRUD Operations**: List, get, create, and update entities\n- **GraphQL Support**: Use custom queries for advanced operations\n- **Interactive Ticket Card (MCP Apps)**: ticket results render as an interactive card in MCP Apps hosts — neutral by default, brandable via `window.__BRAND__` injection or `MCP_BRAND_*` env vars\n\n### Interactive Ticket Card (MCP Apps)\n\n`superops_tickets_get` renders as an interactive card in MCP Apps hosts\n(Claude Desktop/web) with an in-card \"Add note\" round-trip via\n`superops_tickets_add_note` that always posts internal-only notes\n(`isPublic: false`); plain-JSON behavior is unchanged in other hosts.\nThe card is neutral by default and brandable via `window.__BRAND__` injection\nor `MCP_BRAND_*` env vars (`MCP_BRAND_NAME`, `MCP_BRAND_LOGO_URL`,\n`MCP_BRAND_PRIMARY_COLOR`, `MCP_BRAND_ACCENT_COLOR`, `MCP_BRAND_BG`,\n`MCP_BRAND_TEXT`) — no rebuild needed.\n\n## Installation\n\n```bash\n# The @wyre-ai scope lives on GitHub Packages and needs a token to install:\nexport NODE_AUTH_TOKEN=$(gh auth token)\nnpm install @wyre-ai/superops-mcp\n```\n\n## Configuration\n\nSet the following environment variables:\n\n```bash\nexport SUPEROPS_API_TOKEN=\"your-api-token\"\nexport SUPEROPS_SUBDOMAIN=\"yourcompany\"\nexport SUPEROPS_REGION=\"us\"  # or \"eu\" for EU region\n```\n\n### Getting Your API Token\n\n1. Log in to SuperOps.ai\n2. Click settings icon > \"My Profile\"\n3. Navigate to \"API token\" tab\n4. Click \"Generate token\"\n5. Copy and securely store the token\n\n## Usage with Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"superops\": {\n      \"command\": \"npx\",\n      \"args\": [\"@wyre-ai/superops-mcp\"],\n      \"env\": {\n        \"SUPEROPS_API_TOKEN\": \"your-api-token\",\n        \"SUPEROPS_SUBDOMAIN\": \"yourcompany\",\n        \"SUPEROPS_REGION\": \"us\"\n      }\n    }\n  }\n}\n```\n\n## Available Domains & Tools\n\n### Navigation\n\n- `superops_navigate` - Navigate to a domain\n- `superops_back` - Return to main menu\n- `superops_test_connection` - Test API connectivity\n\n### Clients Domain\n\n- `superops_clients_list` - List clients with filters\n- `superops_clients_get` - Get client details\n- `superops_clients_search` - Search clients by name\n\n### Tickets Domain\n\n- `superops_tickets_list` - List tickets with filters\n- `superops_tickets_get` - Get ticket details\n- `superops_tickets_create` - Create a new ticket\n- `superops_tickets_update` - Update ticket status/assignment\n- `superops_tickets_add_note` - Add note to ticket\n- `superops_tickets_log_time` - Log time on ticket\n\n### Assets Domain\n\n- `superops_assets_list` - List assets/endpoints\n- `superops_assets_get` - Get asset details\n- `superops_assets_software` - Get software inventory\n- `superops_assets_patches` - Get patch status\n\n### Technicians Domain\n\n- `superops_technicians_list` - List technicians\n- `superops_technicians_get` - Get technician details\n- `superops_technicians_groups` - List technician groups\n\n### Custom Domain\n\n- `superops_custom_query` - Run custom GraphQL query\n- `superops_custom_mutation` - Run custom GraphQL mutation\n\n## Example Usage\n\n```\nUser: What tools are available?\nClaude: Use superops_navigate to select a domain...\n\nUser: Navigate to tickets\nClaude: [calls superops_navigate with domain: \"tickets\"]\nNow in tickets domain. Available tools: superops_tickets_list, superops_tickets_get...\n\nUser: Show open high priority tickets\nClaude: [calls superops_tickets_list with status: [\"Open\"], priority: [\"High\"]]\nHere are the open high priority tickets...\n```\n\n## Rate Limits\n\nSuperOps.ai API has a rate limit of 800 requests per minute per API token.\n\n## Pagination\n\nSuperOps uses page-based pagination, not cursors. List tools take `page`\n(1-indexed, default 1) and `pageSize` (default 50, max 100), and return a\n`listInfo` block with `page`, `pageSize`, `totalCount` and `hasMore`.\n\n**`hasMore` is tri-state:** `true` when another page exists, `null` — never\n`false` — when it does not. Loop on `hasMore === true`, or page off\n`totalCount`; looping until `hasMore === false` never terminates.\n\n## Filtering\n\nFilters are `condition` clauses of `{ attribute, operator, value }`, and they\ncompose — `{ joinOperator: \"and\" | \"or\", operands: [ … ] }` nests recursively.\nOperators verified against a live tenant:\n\n| Operator | Value |\n|---|---|\n| `is`, `isNot`, `contains`, `notContains`, `startsWith`, `endsWith` | string |\n| `includes`, `notIncludes` | array |\n\n`equals` and `in` are rejected by the API. `includes` matches a value *whole*\nwhile `contains` matches a substring — filtering an OS platform with\n`includes: [\"Windows\"]` matches nothing, because SuperOps stores\n`\"Microsoft Windows 10 Pro\"`.\n\nTwo things to know, because neither reports an error:\n\n- Filtering on a value outside a field's real set returns **zero rows, not an\n  error**. An empty result may mean a bad value, not an empty tenant.\n- Filtering on a JSON column (`software`) rather than a path into it\n  (`software.name`) also returns **zero rows silently**.\n\nUse `superops_custom_query` for filter semantics the standard tools don't\nexpress.\n\n## Schema conformance\n\n`schema/superops.graphql` is a vendored copy of the SuperOps GraphQL schema:\n\n```bash\n# Authoritative — generated from live introspection\nSUPEROPS_API_TOKEN=... SUPEROPS_SUBDOMAIN=... node scripts/fetch-schema.mjs\n\n# No credentials? Falls back to scraping the published API reference\nnode scripts/fetch-schema.mjs\n```\n\nPrefer introspection, and note the committed schema is already the introspected\none. The published docs declare 276 types / 76 queries / 63 mutations where the\nlive API reports **404 / 116 / 83**, omit deprecations entirely, and declare two\ntypes that do not exist live (`FieldType`, `TicketType`) — validating against\nthose would pass documents the API rejects.\n\n`src/domains/graphql-schema.test.ts` validates every GraphQL document in `src/`\nagainst it on each `npm test`, so a query referencing a field SuperOps does not\ndefine fails in CI rather than at runtime. Regenerate the schema after a\nSuperOps API change and re-run the tests.\n\n## License\n\nApache-2.0\n\n## Support\n\nFor issues and feature requests, please visit the [GitHub repository](https://github.com/WYRE-AI/superops-mcp/issues).\n",
  "bytes": 7522,
  "sha": "eb18917b0aaf2b328c6b37cee1dac795fe47da74987372f78c72acf2adac3a83",
  "repo_slug": "wyre-ai/superops-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_wyre_ai_superops_mcp_4dc06665/readme"
}