Skip to main content
Glama
powershell-mcp
by IMRRD

winrm_exec

Run PowerShell commands on remote Windows hosts through WinRM without an SSH server or agent on the target. Captures stdout and stderr securely in-process using Invoke-Command.

Instructions

Run a command on a remote Windows host via PowerShell Remoting (WinRM / Invoke-Command). Native to Windows Server — no SSH server or agent needed on the target, only WinRM enabled. Output captured in-process (no console window).

Input Schema

NameRequiredDescriptionDefault
tailNoKeep last bytes rather than first; incomplete UTF-8 boundary scalars are omitted.
useSslNoUse HTTPS/5986 WinRM.
commandYesPowerShell command/scriptblock body to run remotely.
passwordNoCredential password.
usernameNoCredential username (DOMAIN\\user or host\\user). Omit to use the host process identity.
logOutputNoOpt in to private file-backed raw output logs; may include secrets emitted by command.
timeoutMsNoHard timeout in ms (default 120000).
parametersNoJSON-safe named remote script parameters; delivered through protected WinRM stdin payload.
computerNameYesRemote Windows host name or IP.
credentialRefNoOperator-provisioned scoped credential reference, exclusive with raw auth.
logQuotaBytesNoCombined stdout/stderr quota (default 8 MiB); incomplete beyond quota.
authenticationNoWinRM auth mechanism.
maxOutputBytesNoRaw UTF-8 bytes per stream (default 1 MiB).

Output Schema

NameRequiredDescriptionDefault
logNo
detailYes
stderrYes
stdoutYes
targetYes
exitCodeYes
timedOutYes
transportYes
durationMsYes
truncationYes
executionIdYes
errorRecordsNo
schemaVersionYes
terminationStatusYes
terminationCertaintyYes
errorRecordsTruncatedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changedv0.7.0
    • addedInput schema / properties / credentialRef
      Added value: +{
      +  "description": "Operator-provisioned scoped credential reference, exclusive with raw auth.",
      +  "type": "string"
      +}
    • addedInput schema / properties / logOutput
      Added value: +{
      +  "description": "Opt in to private file-backed raw output logs; may include secrets emitted by command.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / logQuotaBytes
      Added value: +{
      +  "description": "Combined stdout/stderr quota (default 8 MiB); incomplete beyond quota.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 8388608,
      +  "type": "integer"
      +}
    • addedInput schema / properties / maxOutputBytes
      Added value: +{
      +  "description": "Raw UTF-8 bytes per stream (default 1 MiB).",
      +  "exclusiveMinimum": 0,
      +  "maximum": 8388608,
      +  "type": "integer"
      +}
    • addedInput schema / properties / parameters
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "JSON-safe named remote script parameters; delivered through protected WinRM stdin payload.",
      +  "propertyNames": {
      +    "pattern": "^[a-zA-Z_][a-zA-Z_0-9]*$",
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / tail
      Added value: +{
      +  "description": "Keep last bytes rather than first; incomplete UTF-8 boundary scalars are omitted.",
      +  "type": "boolean"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "detail": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "bytes": {
      +          "type": "number"
      +        },
      +        "cleanup": {
      +          "enum": [
      +            "not_needed",
      +            "removed",
      +            "failed",
      +            "unknown"
      +          ],
      +          "type": "string"
      +        },
      +        "direction": {
      +          "enum": [
      +            "upload",
      +            "download"
      +          ],
      +          "type": "string"
      +        },
      +        "error": {
      +          "type": "string"
      +        },
      +        "finalized": {
      +          "type": "boolean"
      +        },
      +        "localExitCode": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "sha256": {
      +          "type": "string"
      +        },
      +        "shell": {
      +          "type": "string"
      +        },
      +        "signal": {
      +          "type": "string"
      +        },
      +        "verification": {
      +          "enum": [
      +            "not_started",
      +            "sha256_matched",
      +            "failed"
      +          ],
      +          "type": "string"
      +        },
      +        "version": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "durationMs": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "errorRecords": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "category": {
      +            "type": "string"
      +          },
      +          "exceptionType": {
      +            "type": "string"
      +          },
      +          "fullyQualifiedErrorId": {
      +            "type": "string"
      +          },
      +          "message": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "category",
      +          "fullyQualifiedErrorId",
      +          "exceptionType",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "errorRecordsTruncated": {
      +      "type": "boolean"
      +    },
      +    "executionId": {
      +      "type": "string"
      +    },
      +    "exitCode": {
      +      "anyOf": [
      +        {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "log": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "complete": {
      +          "type": "boolean"
      +        },
      +        "expiresAt": {
      +          "type": "string"
      +        },
      +        "handle": {
      +          "type": "string"
      +        },
      +        "stderrBytes": {
      +          "type": "number"
      +        },
      +        "stdoutBytes": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "handle",
      +        "complete",
      +        "stdoutBytes",
      +        "stderrBytes",
      +        "expiresAt"
      +      ],
      +      "type": "object"
      +    },
      +    "schemaVersion": {
      +      "const": 1,
      +      "type": "number"
      +    },
      +    "stderr": {
      +      "type": "string"
      +    },
      +    "stdout": {
      +      "type": "string"
      +    },
      +    "target": {
      +      "type": "string"
      +    },
      +    "terminationCertainty": {
      +      "enum": [
      +        "unknown",
      +        "root_exited"
      +      ],
      +      "type": "string"
      +    },
      +    "terminationStatus": {
      +      "enum": [
      +        "completed",
      +        "nonzero_exit",
      +        "script_error",
      +        "remote_error",
      +        "timeout",
      +        "cancelled",
      +        "transport_error",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    "timedOut": {
      +      "type": "boolean"
      +    },
      +    "transport": {
      +      "enum": [
      +        "powershell",
      +        "program",
      +        "winrm",
      +        "ssh",
      +        "sftp"
      +      ],
      +      "type": "string"
      +    },
      +    "truncation": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "limitBytesPerStream": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "stderr": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "capturedBytes": {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "observedBytes": {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "omittedBytes": {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "truncated": {
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "observedBytes",
      +            "capturedBytes",
      +            "omittedBytes",
      +            "truncated"
      +          ],
      +          "type": "object"
      +        },
      +        "stdout": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "capturedBytes": {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "observedBytes": {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "omittedBytes": {
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "truncated": {
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "observedBytes",
      +            "capturedBytes",
      +            "omittedBytes",
      +            "truncated"
      +          ],
      +          "type": "object"
      +        },
      +        "truncated": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "truncated",
      +        "limitBytesPerStream"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "schemaVersion",
      +    "executionId",
      +    "transport",
      +    "target",
      +    "stdout",
      +    "stderr",
      +    "exitCode",
      +    "durationMs",
      +    "timedOut",
      +    "truncation",
      +    "terminationStatus",
      +    "terminationCertainty",
      +    "detail"
      +  ],
      +  "type": "object"
      +}
  2. First observedv0.5.0

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does add real value beyond the schema by disclosing the target prerequisite (WinRM enabled, no agent/SSH server) and that output is captured in-process. However, it says nothing about this being arbitrary remote code execution, credential handling, or timeout/truncation behavior that the schema fields only partially cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each doing distinct work: transport, prerequisite, output handling. Front-loaded with the core action and free of padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists and all parameters are documented in the schema, the description covers the key operational context an agent needs (Windows-only, WinRM prerequisite). A minor gap is that it doesn't warn that this executes arbitrary code with whatever privileges the credentials carry.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every one of the 13 parameters is already documented in structured form, and the description adds no parameter-level guidance. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Run a command on a remote Windows host') and pins down the transport (WinRM / Invoke-Command), which separates it from ssh_exec without naming that sibling. It is clear what the tool does, though it doesn't explicitly contrast with run_powershell or ssh_exec.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The prerequisite 'only WinRM enabled' implies when this tool is the right choice over SSH-based siblings, but the description never states when to prefer it over ssh_exec or run_powershell, nor any exclusions. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.