ScreenConnect MCP Server
A read-only ScreenConnect session investigation server for searching, listing, and inspecting sessions and guests.
Search sessions with structured fields (name, machine, user, OS, serial, type, custom properties, online-only) or an exclusive raw filter.
List currently connected guest sessions, defaulting to Access sessions.
Find sessions by exact name.
Retrieve a single session by GUID.
Inspect session details, including connections and newest-first events with optional event-type filtering.
Get guest inventory, online state, and derived uptime.
Use client-side pagination and optional raw payload inclusion; all listed tools are read-only.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ScreenConnect MCP Server show me which ScreenConnect sessions are online right now"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ScreenConnect MCP Server
An open-source TypeScript MCP server for ConnectWise ScreenConnect's RESTful API Manager extension (ConnectWise Labs). Part of the WYRE AI fleet. Runs over stdio or stateless Streamable HTTP with per-tenant credentials.
Unofficial community project; not affiliated with or endorsed by ConnectWise.
Setup
In your ScreenConnect administration console, install and enable the RESTful API Manager extension from ConnectWise Labs.
Configure its
RESTfulAuthenticationSecretwith a strong secret. SetSCREENCONNECT_API_SECRETto the same value. This API usesCTRLAuthHeader, not Basic auth or cookies.If the extension's
RESTfulAllowedOriginis set, setSCREENCONNECT_ORIGINto that exact HTTPS origin.Set
SCREENCONNECT_BASE_URLto your instance's HTTPS URL. The default extension GUID is2d558935-686a-4bd0-9991-07539f5fe749; override it if your installation differs.Start with the default
readtier. Enablewriteandadminexplicitly only when needed.
npm install
npm run build
# Export SCREENCONNECT_BASE_URL and SCREENCONNECT_API_SECRET locally first.
npm startFor MCP clients, use node /path/to/screenconnect-mcp/dist/index.js and pass these environment variables in the client's server configuration.
Each upstream call is POST {baseUrl}/App_Extensions/{extensionId}/Service.ashx/{Method} with a positional JSON array body. HTTP 401/403 means the secret was rejected; 404 usually means the extension is missing, disabled, or has a different ID.
Related MCP server: ConnectWise Live MCP Server
Configuration
Variable | Default | Purpose |
| required locally | Instance HTTPS URL, including an optional context path. Placeholder hosts are rejected. |
| required locally | Extension's |
| unset | Optional exact HTTPS origin for |
| GUID above | Must be a GUID. |
|
| Comma-separated |
|
| Total hunt wall clock budget; clamps to 5000..600000 ms. |
|
| Per-call timeout and retry budget; maximum 120000 ms. |
|
| MCP output cap after redaction; maximum 1000000. |
|
| Streaming body cap before JSON parsing; maximum 128 MiB. Oversize fails closed. |
| unset |
|
|
|
|
|
|
|
| required for HTTP | At least 32 characters; placeholder and repeated values rejected. |
|
| HTTP bind address. Image uses |
| unset | Optional comma-separated Host allowlist for |
| unset |
|
|
|
|
See .env.example. Positive integer settings fall back for invalid/nonpositive values and clamp at their ceiling.
Tools
Every tool supplies readOnlyHint, destructiveHint, and idempotentHint. Tools outside enabled tiers are both hidden and uncallable. All admin tools require confirm: true and carry ⚠ HIGH-IMPACT warnings. The flag prevents accidental invocation; it is not proof of human approval.
Tool | Tier | Purpose |
| read | Structured search, or exclusive advanced raw |
| read | Connected guests; defaults to Access sessions. |
| read | Exact session-name lookup. |
| read | Session by GUID; empty upstream result becomes not found. |
| read | Connections, integer |
| read | Hunt the Nov 2026 campaign using session inventory, events and connections. |
| read | Guest inventory, online state, derived uptime. |
| write | Append note. |
| write | Message guest, with |
| write | Rename session. |
| write | Merge partial slots 1..8 with existing properties. |
| admin | Execute cmd/PowerShell command; optionally poll for output. |
| admin | Execute named toolbox item. |
| admin | Create Support, Meeting or Access session. |
Search fields: sessionType, name, machineName, serialNumber, loggedOnUser, operatingSystem, customProperties (map with keys 1 through 8), and onlineOnly. Structured string values use single-quoted literals with doubled quotes. Advanced filter (max 4000 chars) cannot be combined with any structured field. Lists apply limit (default 50, max 500) and offset client-side and return totalCount; the upstream API still returns the entire matching list. Narrow filters to stay within the upstream byte cap. Session inventory read tools accept includeRaw; raw results are still redacted and capped.
Custom property updates are read-modify-write: fetch current values, merge supplied slots, then replace all eight. Empty strings clear slots. There is no compare-and-swap, so concurrent edits can be lost.
Commands accept at most 8000 characters. shell: powershell prepends #!ps; optional timeoutSeconds (1..3600) adds #timeout=<milliseconds>. waitForOutputSeconds (0..60, default 0) polls details for a new EventType 70 event after the send timestamp and returns its Data. Timestamp correlation is best effort: another operator's command may produce the event, clock skew can prevent matching, and a polling timeout does not mean the command failed. Command submission is fire-and-forget and never retried. Do not resend automatically after an ambiguous result. Event timestamps in ISO or .NET /Date(...) / form are accepted. Missing inventory fields are tolerated; unavailable uptime is null.
Hunting the Nov 2026 campaign
screenconnect_hunt_campaign is read-only, enabled in the default read tier, and requires no confirmation. It makes one GetSessionsByFilter call, scans the first maxSessions list records, and fetches GetSessionDetailsBySessionID with concurrency four. It checks inventory, client IDs, campaign infrastructure, dropped files, persistence markers, operators, host connections and commands/toolbox activity. It never opens a remote session or performs remediation.
Example MCP call:
{
"name": "screenconnect_hunt_campaign",
"arguments": {
"since": "2026-11-11T17:47:00Z",
"sessionType": "Access",
"maxSessions": 500,
"knownOperators": ["jsmith"],
"massThreshold": 5,
"massWindowMinutes": 15
}
}Input | Default | Bounds / meaning |
|
| ISO-8601 timestamp with timezone; inclusive. |
| Hunt start time | ISO timestamp strictly after |
|
|
|
| unset | Raw filter, at most 4000 characters; used as-is, overriding |
| 500 | Integer 1..5000; list pagination is client-side. |
| unset | Up to 200 strings, each 3..500 characters; medium severity substring matches. |
| unset | Up to 500 names, each at most 255 characters; case-insensitive allowlist. Omit to skip unknown-operator checks. |
| 5 | Integer 2..1000 distinct sessions. |
| 15 | Integer 1..1440; sliding window for identical normalized commands or toolbox names. |
| 500 | Integer 1..5000; limits returned findings, with omitted count reported. |
| false | Accepted for compatibility; no clean-session list is returned. |
IOC matching undoes common defanging, requires digit boundaries for IPs, and matches Addmin as a whole word in text or an exact actor name. Bare screen only matches an exact connection hostname/participant. sqlite3.exe alone is low confidence. Every command/toolbox event in the time window produces an informational finding. Mass execution strips PowerShell/timeout/maxlength directives and collapses whitespace before comparing text across distinct sessions. Clusters report maximal qualifying sliding windows; overlapping windows may share sessions. One mass-execution finding is added per involved session. Mass execution alone is medium severity; clusters with IOC hits are high severity.
The summary reports full finding counts before truncation, flagged sessions (excluding info-only activity), earliest timestamped hit, detail-read errors, skipped sessions and partial coverage. Inventory hits have no event timestamp and are checked regardless of the event window; earliestHit is null when no timestamped hit exists. Connections count when their known start and optional end overlap the window; connections missing a start timestamp cannot establish coverage. Nested connection events use their own timestamps. Per-session errors preserve available results and include only generic sample messages. A failed initial search fails the tool. SCREENCONNECT_HUNT_BUDGET_MS bounds the entire hunt (default 120 seconds); budget expiry or caller cancellation stops launching detail reads and returns partial results after a successful initial search. Narrow the filter or adjust limits to follow up on partial results. The shared SCREENCONNECT_MAX_RESPONSE_CHARS output cap still applies; reduce maxFindings or increase that cap for large reports.
Coverage gaps:
Panel login history and the ScreenConnect audit log are NOT available through the RESTful API Manager extension; check Administration > Audit in the SC web UI and the ConnectWise advisory.
Event/connection field names (
Host,ParticipantName,NetworkAddress,ProcessType, eventDatafor toolbox items) are inferred from public prior art and unverified against a live instance. The parser tolerates actor aliases and integer or string event types; missing/invalid event times are skipped.Endpoints with a rogue second ScreenConnect client that never connected to THIS instance will not appear; search client IDs and file IOCs with EDR/RMM.
Response next steps (guidance only; the tool takes none of these actions):
Do NOT open GUI/backstage sessions on flagged machines: the campaign reverse-pivots onto tech workstations. Use EDR live response or WinRM instead.
Terminate all active web/host sessions and force sign-out of all users.
Rotate ScreenConnect credentials and the RESTful API Manager secret; verify MFA on every account and remove unknown users such as
Addmin.Remove rogue ScreenConnect client services (IDs
2588ef5c15954b10,ed630cc2c873b091, or unknown instances), theTrapWatchtask,C:\ProgramData\RelayTrap\,%TEMP%\sckit-*folders, HKCU/HKLM Run valueRelayTrapLiteAlert, and droppedsqlite3.exe. Block IOC IPs/domains at the firewall/DNS filter.Review the ConnectWise security advisory resources and preserve logs before cleanup.
IOC source attribution: public r/msp thread “Active malware campaign abusing ScreenConnect” (Nov 11 2026), with corroborating public Blackpoint SOC reporting. Publisher discovery links: r/msp thread title search, Blackpoint reporting. The supplied IOC set was implemented offline; these links are not independently verified article permalinks. To update the data, edit the grouped { value, kind, severity, note } constants in src/hunt/iocs.ts, update IOC_SET_VERSION, and add matching/non-matching test fixtures. Keep customer names out of the IOC file and fixtures.
HTTP / gateway
The image and Compose default to AUTH_MODE=gateway and read-only tools. Set CONDUIT_S2S_SECRET in your environment, then run docker compose up --build. Local HTTP: set MCP_TRANSPORT=http and run node dist/http.js.
POST /mcp requires a valid X-Gateway-S2S signed proof. Gateway credentials are request-scoped and never fall back to environment credentials.
Header | Value |
| Instance HTTPS URL (required). |
| API secret (required). |
| Optional allowed origin. |
| Optional extension GUID. |
| Optional intersection with configured tiers; can only narrow. An empty header exposes no tools. |
GET /health is unauthenticated liveness only and reads no credentials. The transport is stateless, uses JSON responses, and caps inbound bodies at 1 MiB.
Not supported
Session group listing, audit log, ending a session, and file transfer are not exposed by this extension API. Those require the Basic-auth web services and are outside v1's scope.
Security model
HTTPS only, no embedded credentials, query strings, fragments, placeholder hosts, or unsafe context paths. Redirects are never followed.
Outbound requests use DNS-pinned sockets. Each connection resolves and checks the entire answer for private, loopback, link-local, metadata, and reserved addresses before connecting to a checked address. Gateway mode ignores the local private-host override.
Gateway credentials live in AsyncLocalStorage for one request. No environment mutation, cookie authentication, credential persistence, or shared token cache.
Read calls alone retry 429/5xx, at most twice, honoring Retry-After with a 2-second delay cap and a 10-second retry window within the request timeout. Writes are never retried.
GUIDs, lengths, booleans, enums, and paging bounds are checked before upstream calls. Admin actions require explicit confirmation. Only declared arguments reach handlers.
Streaming upstream bodies fail closed on oversize before JSON parsing. Output is redacted before truncation, including exact known secrets, secret-named fields, bearer tokens and JWTs. Logs contain tool names and result status, never arguments or upstream error bodies. Upstream cancellation follows the MCP request signal.
HTTP startup fails closed without a strong S2S secret; insecure development is loopback-only. Use
MCP_ALLOWED_HOSTSwhere appropriate.
Development
npm install
npm run typecheck
npm run lint
npm run build
npm test
npm run smokeVitest uses generic fixtures and mocked outbound transport. The stdio smoke exercises the built server's tool listing, invalid GUID rejection, and default admin exclusion without network access. evals/*.yaml contains mcp-assert checks. CI and release workflows follow fleet conventions and publish ghcr.io/wyre-ai/screenconnect-mcp.
Acknowledgements
API references: christaylorcodes/ConnectWiseControlAPI (MIT), MSPbotsAIFramework/connectwise-screenconnect-mcp (Apache-2.0), and matt-taylor-tech/sc-remote-endpoint-ops-toolkit (MIT). This is an independent TypeScript implementation; their code and branding were not copied.
License
Available Tools
6 toolsscreenconnect_session_getCRead-onlyIdempotent
Get one session by GUID.
Inputs: sessionId (required), includeRaw.
screenconnect_session_get_detailsBRead-onlyIdempotent
Get connections and newest-first events. Unknown detail fields are preserved in details; includeRaw returns the original payload.
Inputs: sessionId (required), limit, eventTypes, includeRaw.
screenconnect_session_get_guest_infoBRead-onlyIdempotent
Get guest inventory, online state and derived uptimeSeconds (null when unavailable).
Inputs: sessionId (required), includeRaw.
screenconnect_sessions_get_by_nameCRead-onlyIdempotent
Find sessions by exact name.
Inputs: name (required), limit, offset, includeRaw.
screenconnect_sessions_list_onlineCRead-onlyIdempotent
List connected guest sessions. Session type defaults to Access.
Inputs: limit, offset, includeRaw, sessionType.
screenconnect_sessions_searchBRead-onlyIdempotent
Search sessions using safely quoted structured fields or an exclusive advanced raw filter. Pagination is client-side.
Inputs: name, limit, filter, offset, +8 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
Most tools return session data, with overlapping lookup paths: search, list_online, and get_by_name can all be used to find sessions. The descriptions clarify intended distinctions, but boundaries between search/get_by_name and get/get_details/get_guest_info still require careful reading.
All names use snake_case with a screenconnect prefix, but the set mixes plural 'sessions' with singular 'session' and noun-first patterns like sessions_search with verb-first patterns like session_get_details. It remains readable, but the convention is not predictable.
Six tools is well-scoped for a read-only ScreenConnect session inspection server. Each tool covers a distinct query mode or detail level, and there are no obviously redundant extras.
The surface covers session search, listing, lookup, details, and guest info well for read-only monitoring. However, it lacks any session control or management operations, such as disconnecting sessions or sending commands, which are central to a ScreenConnect domain.
Maintenance
Related MCP Connectors
Scopable MSP API: clients, quotes, assessments, compliance, QBRs. OAuth 2.1, read-only or read-write
ConnectWise MCP server for ChatGPT, Claude and any AI agent: list tickets, read ticket notes, update ticket, add ticket note, log time entry and create ticket in your own ConnectWise account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to ConnectWise yourself; Cotlet does not store your password and you need no ConnectWise API key. About the official ConnectWise API: ConnectWise PSA, formerly ConnectWise Manage, has a REST API, but no documented ConnectWise-hosted MCP server (checked 5 Nov 2026). To use the API you register on the ConnectWise Developer Network, get a ClientId and create an API member with a public and a private key. Setup and FAQ: https://cotlet.dev/integrations/connectwise-api-mcp-server
Securely control computers you explicitly pair through files, terminals, processes, screenshots, desktop UI/input, clipboard, browser automation, diagnostics, and document tools.
Manage remote servers, SSH terminals, files, databases and proxies with scoped access and approvals.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceIntegrates with ConnectWise Manage API to enable ticket, company, and contact management operations. Supports filtering, pagination, and CRUD actions.8 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with ConnectWise Manage through 45 tools across Service, Operations, and Finance domains, with tier-based access control for finance tools.MIT
- AlicenseNot gradedqualityCmaintenanceProvides governed access to ConnectWise Manage (PSA) data including service tickets, companies, contacts, configurations, projects, sales, time, schedule, finance, and procurement through 68 tools, with read-only mode by default and optional write operations, deployed to Azure with credentials stored in Key Vault.MIT
- AlicenseNot gradedqualityCmaintenanceEnables interaction with N-able RMM (N-sight) API to manage clients, sites, devices, and retrieve monitoring data such as checks, patches, and performance history.Apache 2.0