{"id":"5e387e2d-c0bc-4837-94f7-d2c3f7db2c80","entityType":"agent","slug":"clawhub-inlo-autotask-mcp","name":"Autotask Mcp","canonicalUrl":"https://www.xpersona.co/agent/clawhub-inlo-autotask-mcp","canonicalPath":"/agent/clawhub-inlo-autotask-mcp","generatedAt":"2026-10-11T14:15:07.464Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T11:03:15.166Z","emptyReason":null},"description":"Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and... Skill: Autotask Mcp Owner: inlo Summary: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and... Tags: latest:1.0.4 Version history: v1.0.4 | 2026-02-16T16:26:56.419Z | auto - Added an explicit env section to SKILL.md, listing all supported environment variables with details on their purpose and secrecy. - No chan","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s174p2q56g4ythqetyzjhmcr2s885f8x:autotask-mcp","sourceUrl":"https://clawhub.ai/inlo/autotask-mcp","homepage":"https://clawhub.ai/inlo/skills/autotask-mcp","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/inlo/autotask-mcp","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/inlo/skills/autotask-mcp","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:03:15.166Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:03:15.166Z","emptyReason":null},"stars":null,"forks":null,"downloads":1082,"packageName":null,"latestVersion":"1.0.4","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:03:15.099Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:03:15.166Z","lastCrawledAt":"2026-10-11T11:03:15.099Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:03:15.099Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.4","createdAt":"2026-02-16T16:26:56.419Z","changelog":"- Added an explicit env section to SKILL.md, listing all supported environment variables with details on their purpose and secrecy. - No changes to code or main functionality; documentation improved for clarity.","fileCount":13,"zipByteSize":11865},{"version":"1.0.3","createdAt":"2026-02-16T16:21:29.772Z","changelog":"- Added ./scripts/mcp_pin_digest.sh script for pinning a known-good Docker image digest. - Introduced a test script: tests/test_hardening.sh. - Allowed auto-update scheduling via macOS LaunchAgent or Linux systemd timer (no longer modifies crontab). - Updated SKILL.md to document mcp_pin_digest.sh usage and new update scheduling system. - Minor clarifications in update instructions and file change procedures.","fileCount":13,"zipByteSize":11384},{"version":"1.0.2","createdAt":"2026-02-15T19:57:02.506Z","changelog":"- Added automation scripts: cron-based update installer/uninstaller and MCP updater. - Sample `.env.example.txt` replaced; environment variable setup documentation updated for improved security. - Introduced strict agent security rules—agents must not print, transmit, or mishandle secret credentials. - Expanded documentation with instructions for safe environment setup, container updates, and usage of new scripts. - New README and metadata files included for better project overview.","fileCount":11,"zipByteSize":6985},{"version":"1.0.1","createdAt":"2026-02-11T16:32:37.282Z","changelog":"- Added SKILL.md with detailed instructions and environment variable requirements. - Clarified usage with Datto/Kaseya Autotask PSA via an MCP server. - Included steps for local Docker Compose deployment and helper scripts. - Specified required environment variables for configuration. .env required fields AUTOTASK_INTEGRATION_CODE= AUTOTASK_USERNAME= AUTOTASK_SECRET= # Convenience variable for clients (not required by the container itself) AUTOTASK_MCP_URL=http://localhost:8080/mcp","fileCount":8,"zipByteSize":2728}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s174p2q56g4ythqetyzjhmcr2s885f8x:autotask-mcp","setupComplexity":"medium","setupSteps":["Docker environment detected. We recommend running `docker compose up -d` in an isolated bridge network rather than host mode.","Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:15:07.462Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-inlo-autotask-mcp/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T11:03:15.166Z","emptyReason":null},"readme":"Skill: Autotask Mcp\n\nOwner: inlo\n\nSummary: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and...\n\nTags: latest:1.0.4\n\nVersion history:\n\nv1.0.4 | 2026-02-16T16:26:56.419Z | auto\n\n- Added an explicit env section to SKILL.md, listing all supported environment variables with details on their purpose and secrecy.\n- No changes to code or main functionality; documentation improved for clarity.\n\nv1.0.3 | 2026-02-16T16:21:29.772Z | auto\n\n- Added ./scripts/mcp_pin_digest.sh script for pinning a known-good Docker image digest.\n- Introduced a test script: tests/test_hardening.sh.\n- Allowed auto-update scheduling via macOS LaunchAgent or Linux systemd timer (no longer modifies crontab).\n- Updated SKILL.md to document mcp_pin_digest.sh usage and new update scheduling system.\n- Minor clarifications in update instructions and file change procedures.\n\nv1.0.2 | 2026-02-15T19:57:02.506Z | auto\n\n- Added automation scripts: cron-based update installer/uninstaller and MCP updater.\n- Sample `.env.example.txt` replaced; environment variable setup documentation updated for improved security.\n- Introduced strict agent security rules—agents must not print, transmit, or mishandle secret credentials.\n- Expanded documentation with instructions for safe environment setup, container updates, and usage of new scripts.\n- New README and metadata files included for better project overview.\n\nv1.0.1 | 2026-02-11T16:32:37.282Z | user\n\n- Added SKILL.md with detailed instructions and environment variable requirements.\n\n- Clarified usage with Datto/Kaseya Autotask PSA via an MCP server.\n\n- Included steps for local Docker Compose deployment and helper scripts.\n\n- Specified required environment variables for configuration.\n\n\n.env required fields\n\nAUTOTASK_INTEGRATION_CODE=\nAUTOTASK_USERNAME=\nAUTOTASK_SECRET=\n\n# Convenience variable for clients (not required by the container itself)\nAUTOTASK_MCP_URL=http://localhost:8080/mcp\n\nArchive index:\n\nArchive v1.0.4: 13 files, 11865 bytes\n\nFiles: _meta.json (131b), docker-compose.yml (1157b), README.md (6932b), scripts/cron_install.sh (2942b), scripts/cron_uninstall.sh (1276b), scripts/mcp_down.sh (83b), scripts/mcp_logs.sh (97b), scripts/mcp_pin_digest.sh (1062b), scripts/mcp_pull.sh (120b), scripts/mcp_up.sh (84b), scripts/mcp_update.sh (1764b), SKILL.md (4042b), tests/test_hardening.sh (3282b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: autotask-mcp\ndescription: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and queries). Includes Docker Compose + helper scripts to pull/run the Autotask MCP server locally and configure required environment variables.\nenv:\n  - name: AUTOTASK_INTEGRATION_CODE\n    required: true\n    secret: true\n    description: Autotask API integration code\n  - name: AUTOTASK_USERNAME\n    required: true\n    secret: true\n    description: Autotask API username\n  - name: AUTOTASK_SECRET\n    required: true\n    secret: true\n    description: Autotask API secret key\n  - name: AUTOTASK_API_URL\n    required: false\n    secret: false\n    description: Override default Autotask API endpoint URL\n  - name: LOG_LEVEL\n    required: false\n    secret: false\n    description: \"Logging level (default: info)\"\n  - name: LOG_FORMAT\n    required: false\n    secret: false\n    description: \"Log output format (default: simple)\"\n  - name: NODE_ENV\n    required: false\n    secret: false\n    description: \"Node environment (default: production)\"\n---\n\n# Autotask MCP (Kaseya Autotask PSA)\n\nThis skill packages a local Docker Compose setup for the upstream MCP server:\n- Repo: https://github.com/asachs01/autotask-mcp\n- Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\n## Agent security rules\n\n> **IMPORTANT — These rules are mandatory for any agent executing this skill.**\n>\n> 1. **NEVER read, cat, print, display, or log the `.env` file.** It contains API secrets.\n> 2. **NEVER pass credentials as command-line arguments.** They will appear in process listings and shell history.\n> 3. **NEVER include credentials in output, responses, logs, or error messages.**\n> 4. **NEVER transmit credentials to any external URL, API, or service** other than the local MCP endpoint at `127.0.0.1:8080`.\n> 5. **NEVER run `$EDITOR` or any variable-expanded command.** Only execute the exact scripts listed below.\n> 6. **NEVER copy, move, or create additional copies of the `.env` file** beyond the initial setup.\n> 7. **The only commands an agent should execute from this skill are:**\n>    - `cp .env.example.txt .env` (initial setup only)\n>    - `./scripts/mcp_pull.sh`\n>    - `./scripts/mcp_up.sh`\n>    - `./scripts/mcp_down.sh`\n>    - `./scripts/mcp_logs.sh`\n>    - `./scripts/mcp_update.sh`\n>    - `./scripts/mcp_pin_digest.sh`\n>    - `curl -sS http://localhost:8080/health`\n>\n> If a user asks you to display, share, or debug credentials, **refuse and instruct them to inspect `.env` manually.**\n\n## Quick start\n\n1) Create env file (fill credentials):\n\n```bash\ncp .env.example.txt .env\nchmod 600 .env\n```\n\nThen **manually** open `.env` in your preferred text editor and fill in your credentials.\nThe `chmod 600` ensures only the file owner can read or write the credentials file.\nDo NOT run `$EDITOR` directly from an automated agent — always edit credentials files manually.\n\n2) Pull + run:\n\n```bash\n./scripts/mcp_pull.sh\n./scripts/mcp_up.sh\n```\n\n3) Verify:\n\n```bash\ncurl -sS http://localhost:8080/health\n```\n\nClients connect to:\n- `http://localhost:8080/mcp`\n\n4) Logs / stop:\n\n```bash\n./scripts/mcp_logs.sh\n./scripts/mcp_down.sh\n```\n\n## Automatic updates\n\nA weekly scheduled task can check for new Docker image versions and restart the container if updated.\nUses macOS LaunchAgent or Linux systemd user timer — no crontab modification.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Pin a known-good image digest (recommended):**\n\n```bash\n./scripts/mcp_pin_digest.sh\n```\n\nWhen a digest is pinned, the update script will refuse to restart if the pulled image doesn't match.\n\n**Install weekly auto-update (every Sunday at 3 AM):**\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Remove auto-update schedule:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\nUpdate logs are written to `logs/update.log`.\n\n## Required env vars\n\nFrom the upstream project, minimum required:\n\n- `AUTOTASK_INTEGRATION_CODE`\n- `AUTOTASK_USERNAME`\n- `AUTOTASK_SECRET`\n\n(See `.env.example`.)\n\nFile v1.0.4:README.md\n\n# Autotask MCP\n\nA Docker Compose skill for running the [Autotask MCP server](https://github.com/asachs01/autotask-mcp) locally. Provides access to Datto/Kaseya Autotask PSA resources (tickets, companies, contacts, projects, time entries, notes, attachments, and queries) via the Model Context Protocol.\n\n**Version:** 1.0.4\n\n## Prerequisites\n\n- Docker and Docker Compose\n- Autotask API credentials (Integration Code, Username, Secret)\n\n## Setup\n\n1. **Create your environment file:**\n\n   ```bash\n   cp .env.example.txt .env\n   chmod 600 .env\n   ```\n\n   Then **manually** open `.env` in your preferred text editor and fill in your credentials.\n   The `chmod 600` restricts the file so only the owner can read or write it.\n\n   > **Security note:** Never run `$EDITOR` from an automated agent. Always edit credential files manually.\n\n2. **Pull the image and start the service:**\n\n   ```bash\n   ./scripts/mcp_pull.sh\n   ./scripts/mcp_up.sh\n   ```\n\n3. **Verify the service is healthy:**\n\n   ```bash\n   curl -sS http://localhost:8080/health\n   ```\n\n   MCP endpoint: `http://localhost:8080/mcp`\n\n## Scripts\n\n| Script | Description |\n|---|---|\n| `scripts/mcp_pull.sh` | Pull the latest Docker image |\n| `scripts/mcp_up.sh` | Start the service in detached mode |\n| `scripts/mcp_down.sh` | Stop and remove the container |\n| `scripts/mcp_logs.sh` | Tail container logs (last 200 lines) |\n| `scripts/mcp_update.sh` | Check for image updates and restart if a new version is found |\n| `scripts/mcp_pin_digest.sh` | Pin the current image digest for supply chain verification |\n| `scripts/cron_install.sh` | Install a weekly scheduled task (Sunday 3 AM) to auto-update |\n| `scripts/cron_uninstall.sh` | Remove the auto-update scheduled task |\n\n## Automatic Updates\n\nThe update script compares image digests before and after pulling, and only restarts the container when a new image is detected. Logs are written to `logs/update.log`.\n\n### Digest Pinning (Supply Chain Protection)\n\nYou can pin the current image digest so that the update script refuses to restart if a pulled image doesn't match:\n\n```bash\n./scripts/mcp_pin_digest.sh\n```\n\nWhen pinned, `mcp_update.sh` will pull the latest image but **abort** if the digest differs from the pin. This prevents silent supply chain compromises. Re-run `mcp_pin_digest.sh` after manually verifying a new version.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Enable weekly auto-updates:**\n\nUses macOS LaunchAgent or Linux systemd user timer — no direct crontab modification.\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Disable auto-updates:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\n## Environment Variables\n\n### Required\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_INTEGRATION_CODE` | Your Autotask API integration code |\n| `AUTOTASK_USERNAME` | Your Autotask API username |\n| `AUTOTASK_SECRET` | Your Autotask API secret |\n\n### Optional\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_API_URL` | Override the default Autotask API endpoint |\n| `LOG_LEVEL` | Logging level (default: `info`) |\n| `LOG_FORMAT` | Log format (default: `simple`) |\n| `NODE_ENV` | Node environment (default: `production`) |\n\nSee `.env.example.txt` for the full template.\n\n### Registry Metadata (Secret Handling)\n\nBoth `_meta.json` and the SKILL.md frontmatter now declare required env vars with `secret: true` flags. This allows the skill registry/platform to:\n\n- **Validate** that required credentials are configured before launching\n- **Enforce masking** of secret values in logs, UI, and agent output\n- **Distinguish** secrets from plain configuration (e.g. `LOG_LEVEL` is not secret, `AUTOTASK_SECRET` is)\n- **Audit** which skills require credential access\n\nSkill authors publishing to the registry should include an `env` block in `_meta.json` (and optionally in the SKILL.md frontmatter) to opt into platform-level secret enforcement.\n\n## Security\n\n### Agent Guardrails\n\nSKILL.md includes mandatory security rules that agents must follow when executing this skill:\n\n- **No credential access** — Agents must never read, display, log, or output the `.env` file\n- **No variable expansion** — Agents must never run `$EDITOR` or any shell-variable-expanded command\n- **No external transmission** — Credentials must never be sent to any destination other than `127.0.0.1:8080`\n- **Command allowlist** — Agents may only execute the specific scripts and commands listed in SKILL.md\n- **Refusal policy** — If asked to show or share credentials, agents must refuse and instruct the user to inspect `.env` manually\n\n### Credential Protection\n\n- **File permissions** — `.env` is created with `chmod 600` (owner-only read/write)\n- **Git exclusion** — `.env` is gitignored to prevent accidental commits\n- **No duplication** — Agents are prohibited from copying or moving the `.env` file\n\n### Container Hardening\n\n- **Localhost-only binding** — Port 8080 is bound to `127.0.0.1`, not exposed externally\n- **Read-only filesystem** — Container filesystem is mounted read-only (`read_only: true`)\n- **Dropped capabilities** — All Linux capabilities are dropped (`cap_drop: ALL`)\n- **No privilege escalation** — `no-new-privileges` security option enabled\n- **Tmpfs for temp files** — `/tmp` is mounted as tmpfs with 64 MB limit, noexec, nosuid\n- **Resource limits** — Memory capped at 512 MB, CPU capped at 1 core, max 64 PIDs\n- **Log rotation** — Container logs limited to 3 files of 10 MB each\n\n### Supply Chain Verification\n\n- **Digest pinning** — Pin a known-good image digest with `scripts/mcp_pin_digest.sh`\n- **Update verification** — `mcp_update.sh` refuses to restart if pulled digest doesn't match pin\n- **No crontab modification** — Scheduled updates use macOS LaunchAgent or Linux systemd user timers\n\n## Project Structure\n\n```\nautotask-mcp/\n├── SKILL.md              # Skill definition for MCP clients\n├── README.md             # This file\n├── docker-compose.yml    # Service configuration\n├── .env.example.txt      # Environment variable template\n├── .gitignore            # Excludes .env, .pinned-digest, and logs/\n├── .pinned-digest        # Pinned image digest (created by mcp_pin_digest.sh)\n├── _meta.json            # Skill metadata\n├── logs/                 # Update and cron logs (gitignored)\n└── scripts/\n    ├── mcp_pull.sh       # Pull Docker image\n    ├── mcp_up.sh         # Start service\n    ├── mcp_down.sh       # Stop service\n    ├── mcp_logs.sh       # Tail logs\n    ├── mcp_update.sh     # Check for updates (with digest verification)\n    ├── mcp_pin_digest.sh # Pin current image digest\n    ├── cron_install.sh   # Install weekly update (LaunchAgent/systemd)\n    └── cron_uninstall.sh # Remove weekly update schedule\n```\n\n## Upstream\n\n- Repository: https://github.com/asachs01/autotask-mcp\n- Docker Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn701d1v7ehbwdhwk54h6dqzdd80zpsa\",\n  \"slug\": \"autotask-mcp\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1771259216419\n}\n\nFile v1.0.4:docker-compose.yml\n\nservices:\n  autotask-mcp:\n    image: ghcr.io/asachs01/autotask-mcp:latest\n    container_name: autotask-mcp\n    env_file:\n      - .env\n    environment:\n      # Run the MCP server in HTTP mode inside Docker\n      MCP_TRANSPORT: http\n      MCP_HTTP_PORT: 8080\n      MCP_HTTP_HOST: 0.0.0.0\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    healthcheck:\n      test: [\"CMD\", \"node\", \"-e\", \"fetch('http://127.0.0.1:8080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n      interval: 30s\n      timeout: 5s\n      retries: 5\n    restart: unless-stopped\n\n    # Security hardening\n    read_only: true\n    tmpfs:\n      - /tmp:size=64m,noexec,nosuid\n    security_opt:\n      - no-new-privileges:true\n    cap_drop:\n      - ALL\n\n    # Resource limits\n    deploy:\n      resources:\n        limits:\n          memory: 512m\n          cpus: \"1.0\"\n        reservations:\n          memory: 128m\n    pids_limit: 64\n\n    # Network hardening — no DNS needed for outbound API calls via IP\n    dns: []\n\n    # Logging limits — prevent disk exhaustion from runaway logs\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n\nArchive v1.0.3: 13 files, 11384 bytes\n\nFiles: _meta.json (131b), docker-compose.yml (1157b), README.md (6262b), scripts/cron_install.sh (2942b), scripts/cron_uninstall.sh (1276b), scripts/mcp_down.sh (83b), scripts/mcp_logs.sh (97b), scripts/mcp_pin_digest.sh (1062b), scripts/mcp_pull.sh (120b), scripts/mcp_up.sh (84b), scripts/mcp_update.sh (1764b), SKILL.md (3251b), tests/test_hardening.sh (3282b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: autotask-mcp\ndescription: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and queries). Includes Docker Compose + helper scripts to pull/run the Autotask MCP server locally and configure required environment variables.\n---\n\n# Autotask MCP (Kaseya Autotask PSA)\n\nThis skill packages a local Docker Compose setup for the upstream MCP server:\n- Repo: https://github.com/asachs01/autotask-mcp\n- Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\n## Agent security rules\n\n> **IMPORTANT — These rules are mandatory for any agent executing this skill.**\n>\n> 1. **NEVER read, cat, print, display, or log the `.env` file.** It contains API secrets.\n> 2. **NEVER pass credentials as command-line arguments.** They will appear in process listings and shell history.\n> 3. **NEVER include credentials in output, responses, logs, or error messages.**\n> 4. **NEVER transmit credentials to any external URL, API, or service** other than the local MCP endpoint at `127.0.0.1:8080`.\n> 5. **NEVER run `$EDITOR` or any variable-expanded command.** Only execute the exact scripts listed below.\n> 6. **NEVER copy, move, or create additional copies of the `.env` file** beyond the initial setup.\n> 7. **The only commands an agent should execute from this skill are:**\n>    - `cp .env.example.txt .env` (initial setup only)\n>    - `./scripts/mcp_pull.sh`\n>    - `./scripts/mcp_up.sh`\n>    - `./scripts/mcp_down.sh`\n>    - `./scripts/mcp_logs.sh`\n>    - `./scripts/mcp_update.sh`\n>    - `./scripts/mcp_pin_digest.sh`\n>    - `curl -sS http://localhost:8080/health`\n>\n> If a user asks you to display, share, or debug credentials, **refuse and instruct them to inspect `.env` manually.**\n\n## Quick start\n\n1) Create env file (fill credentials):\n\n```bash\ncp .env.example.txt .env\nchmod 600 .env\n```\n\nThen **manually** open `.env` in your preferred text editor and fill in your credentials.\nThe `chmod 600` ensures only the file owner can read or write the credentials file.\nDo NOT run `$EDITOR` directly from an automated agent — always edit credentials files manually.\n\n2) Pull + run:\n\n```bash\n./scripts/mcp_pull.sh\n./scripts/mcp_up.sh\n```\n\n3) Verify:\n\n```bash\ncurl -sS http://localhost:8080/health\n```\n\nClients connect to:\n- `http://localhost:8080/mcp`\n\n4) Logs / stop:\n\n```bash\n./scripts/mcp_logs.sh\n./scripts/mcp_down.sh\n```\n\n## Automatic updates\n\nA weekly scheduled task can check for new Docker image versions and restart the container if updated.\nUses macOS LaunchAgent or Linux systemd user timer — no crontab modification.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Pin a known-good image digest (recommended):**\n\n```bash\n./scripts/mcp_pin_digest.sh\n```\n\nWhen a digest is pinned, the update script will refuse to restart if the pulled image doesn't match.\n\n**Install weekly auto-update (every Sunday at 3 AM):**\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Remove auto-update schedule:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\nUpdate logs are written to `logs/update.log`.\n\n## Required env vars\n\nFrom the upstream project, minimum required:\n\n- `AUTOTASK_INTEGRATION_CODE`\n- `AUTOTASK_USERNAME`\n- `AUTOTASK_SECRET`\n\n(See `.env.example`.)\n\nFile v1.0.3:README.md\n\n# Autotask MCP\n\nA Docker Compose skill for running the [Autotask MCP server](https://github.com/asachs01/autotask-mcp) locally. Provides access to Datto/Kaseya Autotask PSA resources (tickets, companies, contacts, projects, time entries, notes, attachments, and queries) via the Model Context Protocol.\n\n**Version:** 1.0.2\n\n## Prerequisites\n\n- Docker and Docker Compose\n- Autotask API credentials (Integration Code, Username, Secret)\n\n## Setup\n\n1. **Create your environment file:**\n\n   ```bash\n   cp .env.example.txt .env\n   chmod 600 .env\n   ```\n\n   Then **manually** open `.env` in your preferred text editor and fill in your credentials.\n   The `chmod 600` restricts the file so only the owner can read or write it.\n\n   > **Security note:** Never run `$EDITOR` from an automated agent. Always edit credential files manually.\n\n2. **Pull the image and start the service:**\n\n   ```bash\n   ./scripts/mcp_pull.sh\n   ./scripts/mcp_up.sh\n   ```\n\n3. **Verify the service is healthy:**\n\n   ```bash\n   curl -sS http://localhost:8080/health\n   ```\n\n   MCP endpoint: `http://localhost:8080/mcp`\n\n## Scripts\n\n| Script | Description |\n|---|---|\n| `scripts/mcp_pull.sh` | Pull the latest Docker image |\n| `scripts/mcp_up.sh` | Start the service in detached mode |\n| `scripts/mcp_down.sh` | Stop and remove the container |\n| `scripts/mcp_logs.sh` | Tail container logs (last 200 lines) |\n| `scripts/mcp_update.sh` | Check for image updates and restart if a new version is found |\n| `scripts/mcp_pin_digest.sh` | Pin the current image digest for supply chain verification |\n| `scripts/cron_install.sh` | Install a weekly scheduled task (Sunday 3 AM) to auto-update |\n| `scripts/cron_uninstall.sh` | Remove the auto-update scheduled task |\n\n## Automatic Updates\n\nThe update script compares image digests before and after pulling, and only restarts the container when a new image is detected. Logs are written to `logs/update.log`.\n\n### Digest Pinning (Supply Chain Protection)\n\nYou can pin the current image digest so that the update script refuses to restart if a pulled image doesn't match:\n\n```bash\n./scripts/mcp_pin_digest.sh\n```\n\nWhen pinned, `mcp_update.sh` will pull the latest image but **abort** if the digest differs from the pin. This prevents silent supply chain compromises. Re-run `mcp_pin_digest.sh` after manually verifying a new version.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Enable weekly auto-updates:**\n\nUses macOS LaunchAgent or Linux systemd user timer — no direct crontab modification.\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Disable auto-updates:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\n## Environment Variables\n\n### Required\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_INTEGRATION_CODE` | Your Autotask API integration code |\n| `AUTOTASK_USERNAME` | Your Autotask API username |\n| `AUTOTASK_SECRET` | Your Autotask API secret |\n\n### Optional\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_API_URL` | Override the default Autotask API endpoint |\n| `LOG_LEVEL` | Logging level (default: `info`) |\n| `LOG_FORMAT` | Log format (default: `simple`) |\n| `NODE_ENV` | Node environment (default: `production`) |\n\nSee `.env.example.txt` for the full template.\n\n## Security\n\n### Agent Guardrails\n\nSKILL.md includes mandatory security rules that agents must follow when executing this skill:\n\n- **No credential access** — Agents must never read, display, log, or output the `.env` file\n- **No variable expansion** — Agents must never run `$EDITOR` or any shell-variable-expanded command\n- **No external transmission** — Credentials must never be sent to any destination other than `127.0.0.1:8080`\n- **Command allowlist** — Agents may only execute the specific scripts and commands listed in SKILL.md\n- **Refusal policy** — If asked to show or share credentials, agents must refuse and instruct the user to inspect `.env` manually\n\n### Credential Protection\n\n- **File permissions** — `.env` is created with `chmod 600` (owner-only read/write)\n- **Git exclusion** — `.env` is gitignored to prevent accidental commits\n- **No duplication** — Agents are prohibited from copying or moving the `.env` file\n\n### Container Hardening\n\n- **Localhost-only binding** — Port 8080 is bound to `127.0.0.1`, not exposed externally\n- **Read-only filesystem** — Container filesystem is mounted read-only (`read_only: true`)\n- **Dropped capabilities** — All Linux capabilities are dropped (`cap_drop: ALL`)\n- **No privilege escalation** — `no-new-privileges` security option enabled\n- **Tmpfs for temp files** — `/tmp` is mounted as tmpfs with 64 MB limit, noexec, nosuid\n- **Resource limits** — Memory capped at 512 MB, CPU capped at 1 core, max 64 PIDs\n- **Log rotation** — Container logs limited to 3 files of 10 MB each\n\n### Supply Chain Verification\n\n- **Digest pinning** — Pin a known-good image digest with `scripts/mcp_pin_digest.sh`\n- **Update verification** — `mcp_update.sh` refuses to restart if pulled digest doesn't match pin\n- **No crontab modification** — Scheduled updates use macOS LaunchAgent or Linux systemd user timers\n\n## Project Structure\n\n```\nautotask-mcp/\n├── SKILL.md              # Skill definition for MCP clients\n├── README.md             # This file\n├── docker-compose.yml    # Service configuration\n├── .env.example.txt      # Environment variable template\n├── .gitignore            # Excludes .env, .pinned-digest, and logs/\n├── .pinned-digest        # Pinned image digest (created by mcp_pin_digest.sh)\n├── _meta.json            # Skill metadata\n├── logs/                 # Update and cron logs (gitignored)\n└── scripts/\n    ├── mcp_pull.sh       # Pull Docker image\n    ├── mcp_up.sh         # Start service\n    ├── mcp_down.sh       # Stop service\n    ├── mcp_logs.sh       # Tail logs\n    ├── mcp_update.sh     # Check for updates (with digest verification)\n    ├── mcp_pin_digest.sh # Pin current image digest\n    ├── cron_install.sh   # Install weekly update (LaunchAgent/systemd)\n    └── cron_uninstall.sh # Remove weekly update schedule\n```\n\n## Upstream\n\n- Repository: https://github.com/asachs01/autotask-mcp\n- Docker Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn701d1v7ehbwdhwk54h6dqzdd80zpsa\",\n  \"slug\": \"autotask-mcp\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1771258889772\n}\n\nFile v1.0.3:docker-compose.yml\n\nservices:\n  autotask-mcp:\n    image: ghcr.io/asachs01/autotask-mcp:latest\n    container_name: autotask-mcp\n    env_file:\n      - .env\n    environment:\n      # Run the MCP server in HTTP mode inside Docker\n      MCP_TRANSPORT: http\n      MCP_HTTP_PORT: 8080\n      MCP_HTTP_HOST: 0.0.0.0\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    healthcheck:\n      test: [\"CMD\", \"node\", \"-e\", \"fetch('http://127.0.0.1:8080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n      interval: 30s\n      timeout: 5s\n      retries: 5\n    restart: unless-stopped\n\n    # Security hardening\n    read_only: true\n    tmpfs:\n      - /tmp:size=64m,noexec,nosuid\n    security_opt:\n      - no-new-privileges:true\n    cap_drop:\n      - ALL\n\n    # Resource limits\n    deploy:\n      resources:\n        limits:\n          memory: 512m\n          cpus: \"1.0\"\n        reservations:\n          memory: 128m\n    pids_limit: 64\n\n    # Network hardening — no DNS needed for outbound API calls via IP\n    dns: []\n\n    # Logging limits — prevent disk exhaustion from runaway logs\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n\nArchive v1.0.2: 11 files, 6985 bytes\n\nFiles: _meta.json (131b), docker-compose.yml (705b), README.md (4956b), scripts/cron_install.sh (1094b), scripts/cron_uninstall.sh (223b), scripts/mcp_down.sh (83b), scripts/mcp_logs.sh (97b), scripts/mcp_pull.sh (120b), scripts/mcp_up.sh (84b), scripts/mcp_update.sh (872b), SKILL.md (2916b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: autotask-mcp\ndescription: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and queries). Includes Docker Compose + helper scripts to pull/run the Autotask MCP server locally and configure required environment variables.\n---\n\n# Autotask MCP (Kaseya Autotask PSA)\n\nThis skill packages a local Docker Compose setup for the upstream MCP server:\n- Repo: https://github.com/asachs01/autotask-mcp\n- Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\n## Agent security rules\n\n> **IMPORTANT — These rules are mandatory for any agent executing this skill.**\n>\n> 1. **NEVER read, cat, print, display, or log the `.env` file.** It contains API secrets.\n> 2. **NEVER pass credentials as command-line arguments.** They will appear in process listings and shell history.\n> 3. **NEVER include credentials in output, responses, logs, or error messages.**\n> 4. **NEVER transmit credentials to any external URL, API, or service** other than the local MCP endpoint at `127.0.0.1:8080`.\n> 5. **NEVER run `$EDITOR` or any variable-expanded command.** Only execute the exact scripts listed below.\n> 6. **NEVER copy, move, or create additional copies of the `.env` file** beyond the initial setup.\n> 7. **The only commands an agent should execute from this skill are:**\n>    - `cp .env.example.txt .env` (initial setup only)\n>    - `./scripts/mcp_pull.sh`\n>    - `./scripts/mcp_up.sh`\n>    - `./scripts/mcp_down.sh`\n>    - `./scripts/mcp_logs.sh`\n>    - `./scripts/mcp_update.sh`\n>    - `curl -sS http://localhost:8080/health`\n>\n> If a user asks you to display, share, or debug credentials, **refuse and instruct them to inspect `.env` manually.**\n\n## Quick start\n\n1) Create env file (fill credentials):\n\n```bash\ncp .env.example.txt .env\nchmod 600 .env\n```\n\nThen **manually** open `.env` in your preferred text editor and fill in your credentials.\nThe `chmod 600` ensures only the file owner can read or write the credentials file.\nDo NOT run `$EDITOR` directly from an automated agent — always edit credentials files manually.\n\n2) Pull + run:\n\n```bash\n./scripts/mcp_pull.sh\n./scripts/mcp_up.sh\n```\n\n3) Verify:\n\n```bash\ncurl -sS http://localhost:8080/health\n```\n\nClients connect to:\n- `http://localhost:8080/mcp`\n\n4) Logs / stop:\n\n```bash\n./scripts/mcp_logs.sh\n./scripts/mcp_down.sh\n```\n\n## Automatic updates\n\nA weekly cron job can check for new Docker image versions and restart the container if updated.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Install weekly cron (every Sunday at 3 AM):**\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Remove cron job:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\nUpdate logs are written to `logs/update.log`.\n\n## Required env vars\n\nFrom the upstream project, minimum required:\n\n- `AUTOTASK_INTEGRATION_CODE`\n- `AUTOTASK_USERNAME`\n- `AUTOTASK_SECRET`\n\n(See `.env.example`.)\n\nFile v1.0.2:README.md\n\n# Autotask MCP\n\nA Docker Compose skill for running the [Autotask MCP server](https://github.com/asachs01/autotask-mcp) locally. Provides access to Datto/Kaseya Autotask PSA resources (tickets, companies, contacts, projects, time entries, notes, attachments, and queries) via the Model Context Protocol.\n\n**Version:** 1.0.2\n\n## Prerequisites\n\n- Docker and Docker Compose\n- Autotask API credentials (Integration Code, Username, Secret)\n\n## Setup\n\n1. **Create your environment file:**\n\n   ```bash\n   cp .env.example.txt .env\n   chmod 600 .env\n   ```\n\n   Then **manually** open `.env` in your preferred text editor and fill in your credentials.\n   The `chmod 600` restricts the file so only the owner can read or write it.\n\n   > **Security note:** Never run `$EDITOR` from an automated agent. Always edit credential files manually.\n\n2. **Pull the image and start the service:**\n\n   ```bash\n   ./scripts/mcp_pull.sh\n   ./scripts/mcp_up.sh\n   ```\n\n3. **Verify the service is healthy:**\n\n   ```bash\n   curl -sS http://localhost:8080/health\n   ```\n\n   MCP endpoint: `http://localhost:8080/mcp`\n\n## Scripts\n\n| Script | Description |\n|---|---|\n| `scripts/mcp_pull.sh` | Pull the latest Docker image |\n| `scripts/mcp_up.sh` | Start the service in detached mode |\n| `scripts/mcp_down.sh` | Stop and remove the container |\n| `scripts/mcp_logs.sh` | Tail container logs (last 200 lines) |\n| `scripts/mcp_update.sh` | Check for image updates and restart if a new version is found |\n| `scripts/cron_install.sh` | Install a weekly cron job (Sunday 3 AM) to auto-update |\n| `scripts/cron_uninstall.sh` | Remove the auto-update cron job |\n\n## Automatic Updates\n\nThe update script compares image digests before and after pulling, and only restarts the container when a new image is detected. Logs are written to `logs/update.log`.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Enable weekly auto-updates:**\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Disable auto-updates:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\n## Environment Variables\n\n### Required\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_INTEGRATION_CODE` | Your Autotask API integration code |\n| `AUTOTASK_USERNAME` | Your Autotask API username |\n| `AUTOTASK_SECRET` | Your Autotask API secret |\n\n### Optional\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_API_URL` | Override the default Autotask API endpoint |\n| `LOG_LEVEL` | Logging level (default: `info`) |\n| `LOG_FORMAT` | Log format (default: `simple`) |\n| `NODE_ENV` | Node environment (default: `production`) |\n\nSee `.env.example.txt` for the full template.\n\n## Security\n\n### Agent Guardrails\n\nSKILL.md includes mandatory security rules that agents must follow when executing this skill:\n\n- **No credential access** — Agents must never read, display, log, or output the `.env` file\n- **No variable expansion** — Agents must never run `$EDITOR` or any shell-variable-expanded command\n- **No external transmission** — Credentials must never be sent to any destination other than `127.0.0.1:8080`\n- **Command allowlist** — Agents may only execute the specific scripts and commands listed in SKILL.md\n- **Refusal policy** — If asked to show or share credentials, agents must refuse and instruct the user to inspect `.env` manually\n\n### Credential Protection\n\n- **File permissions** — `.env` is created with `chmod 600` (owner-only read/write)\n- **Git exclusion** — `.env` is gitignored to prevent accidental commits\n- **No duplication** — Agents are prohibited from copying or moving the `.env` file\n\n### Container Hardening\n\n- **Localhost-only binding** — Port 8080 is bound to `127.0.0.1`, not exposed externally\n- **Read-only filesystem** — Container filesystem is mounted read-only (`read_only: true`)\n- **Dropped capabilities** — All Linux capabilities are dropped (`cap_drop: ALL`)\n- **No privilege escalation** — `no-new-privileges` security option enabled\n- **Tmpfs for temp files** — `/tmp` is mounted as tmpfs (not written to the image layer)\n\n## Project Structure\n\n```\nautotask-mcp-1.0.1/\n├── SKILL.md              # Skill definition for MCP clients\n├── README.md             # This file\n├── docker-compose.yml    # Service configuration\n├── .env.example.txt      # Environment variable template\n├── .gitignore            # Excludes .env and logs/\n├── _meta.json            # Skill metadata\n├── logs/                 # Update and cron logs (gitignored)\n└── scripts/\n    ├── mcp_pull.sh       # Pull Docker image\n    ├── mcp_up.sh         # Start service\n    ├── mcp_down.sh       # Stop service\n    ├── mcp_logs.sh       # Tail logs\n    ├── mcp_update.sh     # Check for updates\n    ├── cron_install.sh   # Install weekly update cron\n    └── cron_uninstall.sh # Remove update cron\n```\n\n## Upstream\n\n- Repository: https://github.com/asachs01/autotask-mcp\n- Docker Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn701d1v7ehbwdhwk54h6dqzdd80zpsa\",\n  \"slug\": \"autotask-mcp\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1771185422506\n}\n\nFile v1.0.2:docker-compose.yml\n\nservices:\n  autotask-mcp:\n    image: ghcr.io/asachs01/autotask-mcp:latest\n    container_name: autotask-mcp\n    env_file:\n      - .env\n    environment:\n      # Run the MCP server in HTTP mode inside Docker\n      MCP_TRANSPORT: http\n      MCP_HTTP_PORT: 8080\n      MCP_HTTP_HOST: 0.0.0.0\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    healthcheck:\n      test: [\"CMD\", \"node\", \"-e\", \"fetch('http://127.0.0.1:8080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n      interval: 30s\n      timeout: 5s\n      retries: 5\n    restart: unless-stopped\n    # Security hardening\n    read_only: true\n    tmpfs:\n      - /tmp\n    security_opt:\n      - no-new-privileges:true\n    cap_drop:\n      - ALL\n\nArchive v1.0.1: 8 files, 2728 bytes\n\nFiles: .env.example.txt (459b), docker-compose.yml (561b), scripts/mcp_down.sh (83b), scripts/mcp_logs.sh (97b), scripts/mcp_pull.sh (120b), scripts/mcp_up.sh (84b), SKILL.md (1137b), _meta.json (131b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: autotask-mcp\ndescription: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and queries). Includes Docker Compose + helper scripts to pull/run the Autotask MCP server locally and configure required environment variables.\n---\n\n# Autotask MCP (Kaseya Autotask PSA)\n\nThis skill packages a local Docker Compose setup for the upstream MCP server:\n- Repo: https://github.com/asachs01/autotask-mcp\n- Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\n## Quick start\n\n1) Create env file (fill credentials):\n\n```bash\ncd /Users/stephan/.openclaw/workspace/skills/autotask-mcp\ncp .env.example .env\n$EDITOR .env\n```\n\n2) Pull + run:\n\n```bash\n./scripts/mcp_pull.sh\n./scripts/mcp_up.sh\n```\n\n3) Verify:\n\n```bash\ncurl -sS http://localhost:8080/health\n```\n\nClients connect to:\n- `http://localhost:8080/mcp`\n\n4) Logs / stop:\n\n```bash\n./scripts/mcp_logs.sh\n./scripts/mcp_down.sh\n```\n\n## Required env vars\n\nFrom the upstream project, minimum required:\n\n- `AUTOTASK_INTEGRATION_CODE`\n- `AUTOTASK_USERNAME`\n- `AUTOTASK_SECRET`\n\n(See `.env.example`.)\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn701d1v7ehbwdhwk54h6dqzdd80zpsa\",\n  \"slug\": \"autotask-mcp\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1770827557282\n}\n\nFile v1.0.1:docker-compose.yml\n\nservices:\n  autotask-mcp:\n    image: ghcr.io/asachs01/autotask-mcp:latest\n    container_name: autotask-mcp\n    env_file:\n      - .env\n    environment:\n      # Run the MCP server in HTTP mode inside Docker\n      MCP_TRANSPORT: http\n      MCP_HTTP_PORT: 8080\n      MCP_HTTP_HOST: 0.0.0.0\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    healthcheck:\n      test: [\"CMD\", \"node\", \"-e\", \"fetch('http://127.0.0.1:8080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n      interval: 30s\n      timeout: 5s\n      retries: 5\n    restart: unless-stopped\n\nFile v1.0.1:.env.example.txt\n\n# Autotask MCP server environment\n# Fill these and save as .env\n\n# Required Autotask API credentials\nAUTOTASK_INTEGRATION_CODE=\nAUTOTASK_USERNAME=\nAUTOTASK_SECRET=\n\n# Convenience variable for clients (not required by the container itself)\nAUTOTASK_MCP_URL=http://localhost:8080/mcp\n\n# Optional (supported by upstream repo)\n# AUTOTASK_API_URL=https://webservices.autotask.net/atservices/1.6/atws.asmx\n# LOG_LEVEL=info\n# LOG_FORMAT=simple\n# NODE_ENV=production","readmeExcerpt":"Skill: Autotask Mcp Owner: inlo Summary: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and... Tags: latest:1.0.4 Version history: v1.0.4 | 2026-02-16T16:26:56.419Z | auto - Added an explicit env section to SKILL.md, listing all supported environment variables with details on their purpose and secrecy. - No chan","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cp .env.example.txt .env\nchmod 600 .env"},{"language":"bash","snippet":"./scripts/mcp_pull.sh\n./scripts/mcp_up.sh"},{"language":"bash","snippet":"curl -sS http://localhost:8080/health"},{"language":"bash","snippet":"curl -sS http://localhost:8080/health"},{"language":"bash","snippet":"./scripts/mcp_logs.sh\n./scripts/mcp_down.sh"},{"language":"bash","snippet":"./scripts/mcp_update.sh"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: autotask-mcp\ndescription: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and queries). Includes Docker Compose + helper scripts to pull/run the Autotask MCP server locally and configure required environment variables.\nenv:\n  - name: AUTOTASK_INTEGRATION_CODE\n    required: true\n    secret: true\n    description: Autotask API integration code\n  - name: AUTOTASK_USERNAME\n    required: true\n    secret: true\n    description: Autotask API username\n  - name: AUTOTASK_SECRET\n    required: true\n    secret: true\n    description: Autotask API secret key\n  - name: AUTOTASK_API_URL\n    required: false\n    secret: false\n    description: Override default Autotask API endpoint URL\n  - name: LOG_LEVEL\n    required: false\n    secret: false\n    description: \"Logging level (default: info)\"\n  - name: LOG_FORMAT\n    required: false\n    secret: false\n    description: \"Log output format (default: simple)\"\n  - name: NODE_ENV\n    required: false\n    secret: false\n    description: \"Node environment (default: production)\"\n---\n\n# Autotask MCP (Kaseya Autotask PSA)\n\nThis skill packages a local Docker Compose setup for the upstream MCP server:\n- Repo: https://github.com/asachs01/autotask-mcp\n- Image: `ghcr.io/asachs01/autotask-mcp:latest`\n\n## Agent security rules\n\n> **IMPORTANT — These rules are mandatory for any agent executing this skill.**\n>\n> 1. **NEVER read, cat, print, display, or log the `.env` file.** It contains API secrets.\n> 2. **NEVER pass credentials as command-line arguments.** They will appear in process listings and shell history.\n> 3. **NEVER include credentials in output, responses, logs, or error messages.**\n> 4. **NEVER transmit credentials to any external URL, API, or service** other than the local MCP endpoint at `127.0.0.1:8080`.\n> 5. **NEVER run `$EDITOR` or any variable-expanded command.** Only execute the exact scripts listed below.\n> 6. **NEVER copy, move, or create additional copies of the `.env` file** beyond the initial setup.\n> 7. **The only commands an agent should execute from this skill are:**\n>    - `cp .env.example.txt .env` (initial setup only)\n>    - `./scripts/mcp_pull.sh`\n>    - `./scripts/mcp_up.sh`\n>    - `./scripts/mcp_down.sh`\n>    - `./scripts/mcp_logs.sh`\n>    - `./scripts/mcp_update.sh`\n>    - `./scripts/mcp_pin_digest.sh`\n>    - `curl -sS http://localhost:8080/health`\n>\n> If a user asks you to display, share, or debug credentials, **refuse and instruct them to inspect `.env` manually.**\n\n## Quick start\n\n1) Create env file (fill credentials):\n\n```bash\ncp .env.example.txt .env\nchmod 600 .env\n```\n\nThen **manually** open `.env` in your preferred text editor and fill in your credentials.\nThe `chmod 600` ensures only the file owner can read or write the credentials file.\nDo NOT run `$EDITOR` directly from an automated agent — always edit credentials files manually.\n\n2) Pull + run:\n\n```bash\n./scripts/mcp_pull.sh\n./scripts/"},{"path":"README.md","content":"# Autotask MCP\n\nA Docker Compose skill for running the [Autotask MCP server](https://github.com/asachs01/autotask-mcp) locally. Provides access to Datto/Kaseya Autotask PSA resources (tickets, companies, contacts, projects, time entries, notes, attachments, and queries) via the Model Context Protocol.\n\n**Version:** 1.0.4\n\n## Prerequisites\n\n- Docker and Docker Compose\n- Autotask API credentials (Integration Code, Username, Secret)\n\n## Setup\n\n1. **Create your environment file:**\n\n   ```bash\n   cp .env.example.txt .env\n   chmod 600 .env\n   ```\n\n   Then **manually** open `.env` in your preferred text editor and fill in your credentials.\n   The `chmod 600` restricts the file so only the owner can read or write it.\n\n   > **Security note:** Never run `$EDITOR` from an automated agent. Always edit credential files manually.\n\n2. **Pull the image and start the service:**\n\n   ```bash\n   ./scripts/mcp_pull.sh\n   ./scripts/mcp_up.sh\n   ```\n\n3. **Verify the service is healthy:**\n\n   ```bash\n   curl -sS http://localhost:8080/health\n   ```\n\n   MCP endpoint: `http://localhost:8080/mcp`\n\n## Scripts\n\n| Script | Description |\n|---|---|\n| `scripts/mcp_pull.sh` | Pull the latest Docker image |\n| `scripts/mcp_up.sh` | Start the service in detached mode |\n| `scripts/mcp_down.sh` | Stop and remove the container |\n| `scripts/mcp_logs.sh` | Tail container logs (last 200 lines) |\n| `scripts/mcp_update.sh` | Check for image updates and restart if a new version is found |\n| `scripts/mcp_pin_digest.sh` | Pin the current image digest for supply chain verification |\n| `scripts/cron_install.sh` | Install a weekly scheduled task (Sunday 3 AM) to auto-update |\n| `scripts/cron_uninstall.sh` | Remove the auto-update scheduled task |\n\n## Automatic Updates\n\nThe update script compares image digests before and after pulling, and only restarts the container when a new image is detected. Logs are written to `logs/update.log`.\n\n### Digest Pinning (Supply Chain Protection)\n\nYou can pin the current image digest so that the update script refuses to restart if a pulled image doesn't match:\n\n```bash\n./scripts/mcp_pin_digest.sh\n```\n\nWhen pinned, `mcp_update.sh` will pull the latest image but **abort** if the digest differs from the pin. This prevents silent supply chain compromises. Re-run `mcp_pin_digest.sh` after manually verifying a new version.\n\n**Manual update:**\n\n```bash\n./scripts/mcp_update.sh\n```\n\n**Enable weekly auto-updates:**\n\nUses macOS LaunchAgent or Linux systemd user timer — no direct crontab modification.\n\n```bash\n./scripts/cron_install.sh\n```\n\n**Disable auto-updates:**\n\n```bash\n./scripts/cron_uninstall.sh\n```\n\n## Environment Variables\n\n### Required\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_INTEGRATION_CODE` | Your Autotask API integration code |\n| `AUTOTASK_USERNAME` | Your Autotask API username |\n| `AUTOTASK_SECRET` | Your Autotask API secret |\n\n### Optional\n\n| Variable | Description |\n|---|---|\n| `AUTOTASK_API_URL` | Override the default Autotask API endpoint |\n| `LOG_L"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn701d1v7ehbwdhwk54h6dqzdd80zpsa\",\n  \"slug\": \"autotask-mcp\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1771259216419\n}"},{"path":"docker-compose.yml","content":"services:\n  autotask-mcp:\n    image: ghcr.io/asachs01/autotask-mcp:latest\n    container_name: autotask-mcp\n    env_file:\n      - .env\n    environment:\n      # Run the MCP server in HTTP mode inside Docker\n      MCP_TRANSPORT: http\n      MCP_HTTP_PORT: 8080\n      MCP_HTTP_HOST: 0.0.0.0\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    healthcheck:\n      test: [\"CMD\", \"node\", \"-e\", \"fetch('http://127.0.0.1:8080/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n      interval: 30s\n      timeout: 5s\n      retries: 5\n    restart: unless-stopped\n\n    # Security hardening\n    read_only: true\n    tmpfs:\n      - /tmp:size=64m,noexec,nosuid\n    security_opt:\n      - no-new-privileges:true\n    cap_drop:\n      - ALL\n\n    # Resource limits\n    deploy:\n      resources:\n        limits:\n          memory: 512m\n          cpus: \"1.0\"\n        reservations:\n          memory: 128m\n    pids_limit: 64\n\n    # Network hardening — no DNS needed for outbound API calls via IP\n    dns: []\n\n    # Logging limits — prevent disk exhaustion from runaway logs\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\""}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and... Skill: Autotask Mcp Owner: inlo Summary: Use when you need to interact with Datto/Kaseya Autotask PSA via an MCP server (tickets, companies, contacts, projects, time entries, notes, attachments, and... Tags: latest:1.0.4 Version history: v1.0.4 | 2026-02-16T16:26:56.419Z | auto - Added an explicit env section to SKILL.md, listing all supported environment variables with details on their purpose and secrecy. - No chan","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1239,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:03:15.166Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:03:15.166Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:15:07.464Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}