{
  "markdown": "# Syncro MCP Server\n\nA Model Context Protocol (MCP) server for Syncro MSP, implementing a decision tree architecture for efficient tool navigation.\n\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/syncro-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/syncro-mcp)\n\n> **Operator note — GitHub Packages authentication (required for one-click deploys).**\n> This server depends on the private `@wyre-technology/node-syncro` SDK, which is\n> hosted on **GitHub Packages**. GitHub Packages requires an authentication token\n> on every install (no anonymous reads, even for public packages), so the cloud\n> builders fail during `npm install` with `401 Unauthorized` unless you supply a\n> token. Create a GitHub **Personal Access Token** with the `read:packages` scope\n> and provide it to the builder:\n>\n> - **Cloudflare Workers** — set a build/environment 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 `npm install`, run `export NODE_AUTH_TOKEN=$(gh auth token)` first.\n\n## Features\n\n- **Decision Tree Architecture**: Tools are organized by domain and loaded lazily\n- **Domain Navigation**: Navigate between customers, tickets, assets, contacts, and invoices\n- **Lazy Loading**: Domain handlers and the Syncro client are loaded on-demand\n- **Full Syncro API Coverage**: Access to key Syncro MSP functionality\n- **Interactive Ticket Card (MCP Apps)**: `syncro_tickets_get` renders as an interactive card in MCP Apps hosts (Claude Desktop/web) with an in-card \"Add comment\" round-trip via `syncro_tickets_add_comment` (internal-only by default); plain-JSON behavior is unchanged in other hosts. The card is neutral by default, 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\n> WYRE MCP servers are distributed via OCI/GHCR images and (where available) MCPB bundles. The npm package `@wyre-ai/syncro-mcp` is also published to **GitHub Packages** (`npm.pkg.github.com`); installing it requires an authenticated `.npmrc` with `read:packages` scope (run `export NODE_AUTH_TOKEN=$(gh auth token)` locally).\n\n### Option 1: WYRE MCP Gateway (Recommended)\n\nUse the hosted gateway at [mcp.wyre.ai](https://mcp.wyre.ai) — paste your Syncro API key into the gateway UI and you're done.\n\n```json\n{\n  \"mcpServers\": {\n    \"syncro\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.wyre.ai/v1/syncro/mcp\",\n      \"headers\": {\n        \"X-Syncro-Api-Key\": \"${SYNCRO_API_KEY}\"\n      }\n    }\n  }\n}\n```\n\n### Option 2: Claude Code CLI (run from GitHub)\n\n```bash\nclaude mcp add syncro \\\n  -e SYNCRO_API_KEY=your-api-key \\\n  -e SYNCRO_SUBDOMAIN=your-subdomain \\\n  -- npx -y github:WYRE-AI/syncro-mcp\n```\n\n### Option 3: Docker (GHCR)\n\n```bash\ndocker run --rm \\\n  -e SYNCRO_API_KEY=your-api-key \\\n  -e SYNCRO_SUBDOMAIN=your-subdomain \\\n  ghcr.io/wyre-ai/syncro-mcp:latest\n```\n\n### Option 4: From Source\n\n```bash\ngit clone https://github.com/WYRE-AI/syncro-mcp.git\ncd syncro-mcp\nnpm ci\nnpm run build\nnode dist/index.js\n```\n\n## Configuration\n\nSet the following environment variables:\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `SYNCRO_API_KEY` | Yes | Your Syncro API key |\n| `SYNCRO_SUBDOMAIN` | No | Your Syncro subdomain (if applicable) |\n\n### Getting Your API Key\n\n1. Log in to your Syncro MSP account\n2. Navigate to Settings > API Tokens\n3. Generate a new API token with appropriate permissions\n\n## Architecture\n\n### Decision Tree Navigation\n\nThe server uses a hierarchical approach to tool discovery:\n\n1. **Initial State**: Only navigation and status tools are exposed\n2. **After Navigation**: Domain-specific tools become available\n3. **Back Navigation**: Return to the main menu to switch domains\n\nThis reduces cognitive load and improves LLM tool selection accuracy.\n\n### Available Domains\n\n| Domain | Description | Tools |\n|--------|-------------|-------|\n| `customers` | Manage customer accounts | list, get, create, search |\n| `tickets` | Manage support tickets | list, get, create, update, add_comment |\n| `assets` | Manage configuration items | list, get, search |\n| `contacts` | Manage customer contacts | list, get, create |\n| `invoices` | View and manage billing | list, get, create, email |\n\n## Tools Reference\n\n### Navigation Tools\n\n#### syncro_navigate\nNavigate to a domain to access its tools.\n\n```json\n{\n  \"domain\": \"customers\" | \"tickets\" | \"assets\" | \"contacts\" | \"invoices\"\n}\n```\n\n#### syncro_back\nReturn to the main menu from any domain.\n\n#### syncro_status\nShow current navigation state and credential status.\n\n### Customers Domain\n\n#### syncro_customers_list\nList customers with optional filters.\n\n```json\n{\n  \"query\": \"search term\",\n  \"business_name\": \"Company Inc\",\n  \"email\": \"contact@example.com\",\n  \"include_disabled\": false,\n  \"page\": 1,\n  \"per_page\": 25\n}\n```\n\n#### syncro_customers_get\nGet a specific customer by ID.\n\n```json\n{\n  \"customer_id\": 123\n}\n```\n\n#### syncro_customers_create\nCreate a new customer.\n\n```json\n{\n  \"business_name\": \"Acme Corp\",\n  \"firstname\": \"John\",\n  \"lastname\": \"Doe\",\n  \"email\": \"john@acme.com\"\n}\n```\n\n#### syncro_customers_search\nSearch customers by query string.\n\n```json\n{\n  \"query\": \"acme\",\n  \"limit\": 25\n}\n```\n\n### Tickets Domain\n\n#### syncro_tickets_list\nList tickets with optional filters.\n\n```json\n{\n  \"customer_id\": 123,\n  \"status\": \"Open\",\n  \"user_id\": 456,\n  \"resolved\": false\n}\n```\n\n#### syncro_tickets_get\nGet a specific ticket by ID.\n\n```json\n{\n  \"ticket_id\": 789\n}\n```\n\n#### syncro_tickets_create\nCreate a new ticket.\n\n```json\n{\n  \"customer_id\": 123,\n  \"subject\": \"Network Issue\",\n  \"problem_type\": \"Network\",\n  \"comment_body\": \"Initial description\"\n}\n```\n\n#### syncro_tickets_update\nUpdate an existing ticket.\n\n```json\n{\n  \"ticket_id\": 789,\n  \"status\": \"Resolved\",\n  \"user_id\": 456\n}\n```\n\n#### syncro_tickets_add_comment\nAdd a comment to a ticket.\n\n```json\n{\n  \"ticket_id\": 789,\n  \"body\": \"Comment text\",\n  \"hidden\": false\n}\n```\n\n### Assets Domain\n\n#### syncro_assets_list\nList assets with optional filters.\n\n```json\n{\n  \"customer_id\": 123,\n  \"asset_type\": \"Desktop\"\n}\n```\n\n#### syncro_assets_get\nGet a specific asset by ID.\n\n```json\n{\n  \"asset_id\": 456\n}\n```\n\n#### syncro_assets_search\nSearch assets by query or serial number.\n\n```json\n{\n  \"query\": \"workstation\",\n  \"asset_serial\": \"SN12345\"\n}\n```\n\n### Contacts Domain\n\n#### syncro_contacts_list\nList contacts with optional filters.\n\n```json\n{\n  \"customer_id\": 123,\n  \"query\": \"john\"\n}\n```\n\n#### syncro_contacts_get\nGet a specific contact by ID.\n\n```json\n{\n  \"contact_id\": 789\n}\n```\n\n#### syncro_contacts_create\nCreate a new contact.\n\n```json\n{\n  \"customer_id\": 123,\n  \"name\": \"Jane Smith\",\n  \"email\": \"jane@example.com\"\n}\n```\n\n### Invoices Domain\n\n#### syncro_invoices_list\nList invoices with optional filters.\n\n```json\n{\n  \"customer_id\": 123,\n  \"status\": \"sent\",\n  \"since_date\": \"2024-01-01\"\n}\n```\n\n#### syncro_invoices_get\nGet a specific invoice by ID.\n\n```json\n{\n  \"invoice_id\": 456\n}\n```\n\n#### syncro_invoices_create\nCreate a new invoice.\n\n```json\n{\n  \"customer_id\": 123,\n  \"due_date\": \"2024-02-01\"\n}\n```\n\n#### syncro_invoices_email\nEmail an invoice to the customer.\n\n```json\n{\n  \"invoice_id\": 456,\n  \"subject\": \"Your Invoice\"\n}\n```\n\n## Rate Limiting\n\nSyncro API has a rate limit of 180 requests per minute. The underlying `@wyre-technology/node-syncro` library handles rate limiting automatically.\n\n## Development\n\n```bash\n# Install dependencies. The @wyre-technology/node-syncro SDK lives on GitHub\n# Packages, so authenticate first:\nexport NODE_AUTH_TOKEN=$(gh auth token)\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\n## License\n\nApache-2.0\n",
  "bytes": 8089,
  "sha": "4f07c3a32b61eb6f9fa9fc65240f2e383a45218a31b9e34248225a223c363e90",
  "repo_slug": "wyre-technology/syncro-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_wyre_technology_syncro_mcp_6939cf1c/readme"
}