VMware Pilot

io.github.vmware-skillsPublished by GitHub account vmware-skillsv2.4.1Updated Nov 1, 2026

Multi-step workflow orchestration for VMware MCP skills with approval gates and rollback.

The publisher's own server: QuickBooks Connector by Meridian

Overview

AI-generated overview

Orchestrates multi-step VMware operations as workflows with state persistence, approval gates, audit trail and explicit rollback.

What you can do
  • Design and edit workflows: turn a goal into a draft, update its steps, confirm it, or build one from a step list or template
  • Inspect building blocks: list the skill catalog and built-in or custom workflow templates
  • Check plans before running: structural review of a planned workflow and status, diff report and audit log
  • Run and gate execution: advance a workflow, pause at approval gates, approve or cancel it
  • Undo work: preview and then roll back steps recorded as succeeded
When to use it
Useful when an assistant must carry out multi-step VMware administration such as clone-test-approve-commit or incident response, where each step should be reviewed, gated and auditable rather than run ad hoc. It is a coordinator, so it only pays off alongside the companion VMware skill servers it drives.
Requirements
Runs locally over stdio as a Python package installed with uv tool install or uvx. Companion skill servers (vmware-aiops, vmware-monitor, vmware-storage, vmware-vks, vmware-nsx, vmware-aria, vmware-avi and others) must be installed for steps to do anything. Self-execution needs the --dispatch flag or VMWARE_PILOT_DISPATCH=stdio; optional HTTPS serving needs a certificate, key and bearer tokens. No credentials are declared by the manifest.
Before you install
Nine of thirteen tools write: they create, confirm, run, approve, cancel and roll back workflows, and rollback is best-effort, never automatic. Without --dispatch the assistant performs each returned step itself, so destructive steps depend on the agent following gates. Optional HTTPS mode requires bearer tokens, and every caller acts with the server's own platform account, so run one endpoint per privilege level. Tool exposure limits are not authorization.

Installation

In SourceWeft

  1. Open VMware Pilot in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

VMware Pilot

For a read-only check of this skill with your model and agent host, use the shared model-fit self-test in the marketplace root.

Author: Wei Zhou, VMware by Broadcom — [email protected] This is a community-driven project by a VMware engineer, not an official VMware product. For official VMware developer tools see developer.broadcom.com.

English | 中文

Multi-step workflow orchestration for VMware MCP skills — state machine, approval gates, audit trail.

Companion skills handle everything else:

SkillScopeInstall
vmware-aiopsVM lifecycle, deployment, guest ops, clusteruv tool install vmware-aiops
vmware-monitorRead-only: inventory, health, alarms, eventsuv tool install vmware-monitor
vmware-storageDatastores, iSCSI, vSAN managementuv tool install vmware-storage
vmware-vksTanzu Namespaces, TKC cluster lifecycleuv tool install vmware-vks
vmware-nsxNSX networking: segments, gateways, NATuv tool install vmware-nsx-mgmt
vmware-nsx-securityDFW firewall rules, security groupsuv tool install vmware-nsx-security
vmware-ariaAria Ops: metrics, alerts, capacityuv tool install vmware-aria
vmware-aviAVI load balancing, pool management, AKO K8s opsuv tool install vmware-avi

Install

bash
uv tool install vmware-pilotvmware-pilot mcp          # start the MCP server (stdio)

Offline / Air-Gapped Install (from source)

This project uses the modern PEP 517 build system (hatchling), so there is no setup.py by design — that is expected, not a missing file. If you cloned the source and hit ERROR: File "setup.py" or "setup.cfg" not found ... editable mode currently requires a setuptools-based build, your pip is older than 21.3 and cannot do an editable (-e) install with a non-setuptools backend. Editable mode is a developer convenience, not needed to run the tool — do one of:

bash
# From the source tree — a normal (non-editable) install builds a wheel:pip install .              # NOT  pip install -e .
# ...or upgrade pip first, and editable works too:pip install --upgrade pip && pip install -e .

For a truly air-gapped host, build the wheels on a connected machine and copy them over — the target then needs no network:

bash
# On a connected machine, collect this package + its dependencies as wheels:pip wheel . -w dist        # → dist/*.whl   (or: uv build, for just this package)
# Copy dist/ to the air-gapped host, then install offline:pip install --no-index --find-links dist vmware-pilot

MCP Tools (13 — 4 read, 9 write)

ToolDescription
get_skill_catalogList all available skills and tools for workflow design
list_workflowsList built-in and custom templates
review_workflowSanity-check a planned workflow before execution
design_workflowNatural language goal → draft workflow
update_draftEdit draft workflow steps
confirm_draftFinalize draft → ready to execute
create_workflow_from_templateCreate and save a workflow from a template (not a dry run), returns workflow_id
create_workflowCreate custom workflow from step list (refused if a destructive step has no approval gate before it)
run_workflowExecute workflow, pauses at approval gates
get_workflow_statusQuery state + diff report + audit log
approveHuman approval, continue execution. Refused while steps before the gate are not_executed, until acknowledge_not_executed=True says you ran them
rollbackExplicit, best-effort undo of steps pilot recorded as succeeded — never automatic. Previews (blast_radius) unless confirm=True
cancel_workflowCancel a workflow — move it to the terminal CANCELLED state. Previews (blast_radius) unless confirm=True

Built-in Templates (15)

n is the number of VMs (or drift items); ranges depend on which optional parameters are set. clone_and_test needs snapshot_name (the snapshot to clone from), resizes staging while it is powered off, and has 8 steps when change_spec is a guest command (an extra gate before it runs in staging). investigate_alert's approvals are synthesis checkpoints; its steps are all reads. See skills/vmware-pilot/references/templates.md for parameters and steps.

TemplateStepsApprovalSkills Used
clone_and_test7-8Yesaiops, monitor
incident_response4Yesmonitor, aiops
investigate_alert4 (8 with deep_dive)Yesmonitor, aria
plan_and_approve3Yesaiops
compliance_scan1-3Nomonitor, aria
network_segment_setup3-6Yesnsx, nsx-security
vks_cluster_deploy5Yesvks
rolling_restart2+3nYesaiops, monitor
capacity_expansion5Yesaria, aiops, monitor
disaster_recovery5Yesaiops, monitor, nsx
patch_deployment1+3nYesaiops, monitor
storage_expansion6Yesstorage
baseline_capture1-5Nomonitor, nsx, storage
baseline_audit1-5Nomonitor, nsx, storage, aria
baseline_remediate3+nYesvaries

Upgrading to 2.0

2.0 renames one MCP tool: plan_workflow → create_workflow_from_template. It always created and saved a workflow from a template (it is a write, not a dry run); the new name says so and sets it apart from create_workflow, which saves your own step list. Parameters and results are unchanged, and so are the CLI commands. The skill catalog also follows vmware-vks's renames (get_supervisor_kubeconfig → issue_supervisor_kubeconfig, get_tkc_kubeconfig → issue_tkc_kubeconfig). Workflows saved with the old names are translated when loaded. If an agent prompt, script or ~/.vmware/rules.yaml names plan_workflow, update it. Requires vmware-policy ≥ 1.19.0. Details: RELEASE_NOTES.md.

MCP Configuration

json
{  "mcpServers": {    "vmware-pilot": {      "command": "vmware-pilot",      "args": ["mcp"]    }  }}

Fallback: {"command": "uvx", "args": ["--from", "vmware-pilot", "vmware-pilot-mcp"]} still works, but uvx re-resolves against PyPI on every start and fails behind a TLS-inspecting corporate proxy (invalid peer certificate: UnknownIssuer). The installed entry point above touches the network zero times; set UV_NATIVE_TLS=true if you must use uvx.

Pilot runs the steps itself: --dispatch

By default pilot executes nothing: run_workflow returns each step in pending_dispatch and your agent performs it. Add --dispatch (or set VMWARE_PILOT_DISPATCH=stdio) and pilot runs each step itself, in that skill's own MCP server (vmware-<skill>-mcp, which must be installed), so the skill's policy rules, confirmation gate and audit apply as usual. Nothing after an approval gate runs before approve, and workflows reach completed.

json
{"mcpServers": {"vmware-pilot": {"command": "vmware-pilot", "args": ["mcp", "--dispatch"]}}}

stdio only: pilot refuses to start with --dispatch and --transport https/http (the skill servers it starts would have no caller identity, so roles could not apply). A step that takes longer than VMWARE_PILOT_DISPATCH_TIMEOUT seconds (default 1800) is recorded interrupted — its effect is unknown — and rollback waits for you to check it. run_workflow and approve take as long as the steps they run: set your MCP client's tool timeout above your longest step. If a call does time out, Pilot carries on and answers nothing else until the step ends; then get_workflow_status shows the outcome. Never perform those steps yourself.

Remote access (HTTPS) and limiting tools

By default vmware-pilot mcp speaks stdio to one local client and offers every tool. Two options change that (vmware-policy ≥ 1.21.0).

Serve over HTTPS so clients on other machines can connect. Every caller needs a bearer token:

bash
vmware-audit token create alice          # prints the token once; give it to alicevmware-audit token list                  # names onlyvmware-audit token revoke alice          # refused from its next request, no restartvmware-pilot mcp --transport https --host 0.0.0.0 --port 8443 \    --cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \    --public-name mcp.example.com

Connect a client (Claude Code shown; any MCP client that supports streamable HTTP and custom headers works):

bash
claude mcp add --transport http vmware-pilot https://mcp.example.com:8443/mcp \    --header "Authorization: Bearer $VMWARE_MCP_TOKEN"
json
{  "mcpServers": {    "vmware-pilot": {      "type": "http",      "url": "https://mcp.example.com:8443/mcp",      "headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }    }  }}
  • The server will not start without a token, refuses Host/Origin values outside --public-name, and checks before it binds that unauthenticated requests get 401. Use a certificate your clients trust for those names.
  • Behind a TLS-terminating reverse proxy on the same machine use --transport http --host 127.0.0.1 --public-name mcp.example.com and pass the Authorization header through.
  • Behind a load balancer or gateway on another machine, keep --transport https (a self-signed certificate is fine), list in --public-name the host name the balancer sends as Host, and have it forward Authorization. Its health probe can use GET /healthz, which needs no token and returns only {"status": "ok"} (vmware-policy ≥ 1.23.0).
  • Send traceparent or X-Request-ID with each request to have it stored on the audit row; vmware-audit log --correlation-id ID then finds the calls behind one platform request.
  • The audit log records each caller as token:<name>. Calls naming different targets run in parallel; calls that name no target run one at a time, so name the target when several people share a server.
  • Everyone who can reach the endpoint acts with this server's account. Tokens identify callers; they grant nothing on the platform. Run one endpoint per privilege level.
  • Several people or roles on one endpoint: run vmware-audit roles enable once, then give each token a role (vmware-audit token create NAME --role reader, or a role in roles.yaml naming tools and targets; vmware-policy ≥ 1.24.0). A role limits what the token may call on this endpoint; it cannot grant more than the account has. See vmware-policy's README, "Roles for network callers".

Offer only read tools, plus the writes you choose:

bash
vmware-pilot mcp --expose read --allow-write cancel_workflow# or: VMWARE_PILOT_MCP_EXPOSE=read VMWARE_PILOT_MCP_ALLOW_WRITE=cancel_workflow vmware-pilot mcp

Tools not offered do not appear in the client's tool list. A bad value or an unknown write tool stops the server (exit 2). This limits what clients are offered; it is not authorization, so the account itself should be least-privilege.

Details: skills/vmware-pilot/references/setup-guide.md ("Serving MCP over HTTPS", "Limiting which tools are offered").

License

MIT

Source: README.md at commit eb8bdec

Tools

13

create_workflow

[WRITE] Create a custom workflow dynamically from a step list. Use this when you already know the steps and no built-in template matches; prefer create_workflow_from_template when one does, and design_workflow when the user gave a goal rather than steps. Call get_skill_catalog first for the skill and tool names a step may target. Each step dict must have: action, skill, tool, params. Optional: rollback_tool, rollback_params. action="require_approval" (skill "pilot", tool "approve") inserts a human approval gate. A workflow whose destructive or unclassifiable step, or a step passing confirm=True, has no gate before it is REFUSED — nothing is saved — and the error names the step and the gate to insert. Returns: dict with workflow_id and plan summary. Next call review_workflow to check the plan, then run_workflow to execute. Nothing is undone automatically on failure; see rollback.

Parametersnamerequiredstepsrequireddescriptionrequiredsave_as_template

design_workflow

[WRITE] Start designing a workflow from a natural language description. Call this when the user describes a complex operation and you need to design a multi-step workflow. Returns a DRAFT workflow with proposed steps for the user to review and edit before execution. Design flow: design_workflow → update_draft (add steps, then iterate on user feedback) → confirm_draft (state becomes PENDING) → run_workflow. Use get_skill_catalog() first to see which tools the steps may target. Returns: dict with workflow_id (state=DRAFT), proposed steps placeholder, and instructions for the AI to fill in steps via update_draft.

Parametersgoalrequiredconstraints

update_draft

[WRITE] Update a DRAFT workflow's name, description, or steps. Call this after design_workflow() to fill in the actual steps, or to modify steps based on user feedback. Use it only while the workflow is still DRAFT — after confirm_draft the steps are frozen and you must create_workflow a new one instead. Each step dict: {action, skill, tool, params, rollback_tool?, rollback_params?} Use action="require_approval" for approval gates. A draft may be saved without them while it is being designed; the result lists every step that still needs one, and confirm_draft refuses until none are left. Returns: Updated workflow summary for user review.

Parametersnamestepsdescriptionworkflow_idrequired

confirm_draft

[WRITE] Confirm a draft workflow — changes state from DRAFT to PENDING. Use this once the user has approved the draft's steps; call update_draft instead if anything still needs changing. After confirmation, the workflow can be executed via run_workflow(). Optionally saves as a YAML template for future reuse. Refused — the draft stays a draft and nothing is saved — while any destructive or unclassifiable step, or any step passing confirm=True, lacks a require_approval gate before it. Returns: Confirmed workflow summary. Call run_workflow() to execute.

Parametersworkflow_idrequiredsave_as_template

create_workflow_from_template

[WRITE] Create and save a workflow from a template, ready for run_workflow. Takes a template name (workflow_type) plus its params, builds the steps the template defines, and persists the workflow in state "pending" — it is not a dry run. Templates are the built-in types below plus custom YAML templates (list_workflows shows both). Use this when the goal matches a template; use create_workflow instead to save your own step list when none of them fit. A custom YAML template whose destructive or unclassifiable step (or step passing confirm=True) has no require_approval gate before it is refused, naming the step and the file to fix. Available workflow types: - clone_and_test: Clone VM → apply changes → monitor → approve → commit - incident_response: Diagnose alert → collect info → approve → remediate - plan_and_approve: Wrap aiops batch operations with approval gate - compliance_scan: Read-only health/capacity/anomaly check (no approval) Returns: dict with workflow_id, steps summary, and plan details.

Parametersparamsrequiredworkflow_typerequired

run_workflow

[WRITE] Advance a planned workflow. Pauses at approval gates. Who runs the steps depends on how this server was started: - with --dispatch (or VMWARE_PILOT_DISPATCH=stdio): Pilot runs each step itself in that skill's own MCP server, stops at each approval gate, and the workflow can reach 'completed'. This call takes as long as the steps it runs. If it times out in your client, Pilot carries on (and answers nothing else until the step ends); afterwards get_workflow_status shows the outcome. NEVER perform the steps yourself. - without it (the default): Pilot runs nothing. Steps are recorded as 'not_executed' and the run ends with outcome='dispatch_required' (NOT 'completed'), listing each step in 'pending_dispatch'. YOU (the calling agent) must perform those skill/tool calls in order. The result says which: a 'pending_dispatch' list means you run them. Safety: the workflow is structurally reviewed before each run. Runs are REFUSED if review finds ungated destructive or unclassifiable steps, or destructive steps inside a parallel group. For a built-in template, force=True overrides that (forced runs are written to the workflow audit log). For a custom workflow (create_workflow, design_workflow, or a YAML template) an ungated step is refused even with force=True: add a require_approval step before it instead. When an approval gate is reached, the workflow pauses with state 'awaiting_approval'. Call approve() to continue. Returns: Current workflow state with 'outcome' (completed | awaiting_approval | dispatch_required | failed) and, when dispatch is required, a 'pending_dispatch' list of steps for the agent to perform.

Parametersforceworkflow_idrequired

approve

[WRITE] Approve a workflow that is waiting for human confirmation. Use this only after showing the user the pending step and getting explicit human consent; use cancel_workflow instead when the approval is rejected. Only works when workflow state is 'awaiting_approval'. After approval, execution continues to the next steps. Without --dispatch, the steps before the gate are 'not_executed': Pilot has no record that they ran, whatever the gate's message says. approve refuses (listing them in not_executed_before_gate) until acknowledge_not_executed=True — set it only after you performed each of those steps yourself and showed the user their results. They are then recorded as 'reported_done' and not handed out again. Note: with --dispatch, approving runs the next steps (this call takes as long as they do; if it times out in your client, Pilot carries on — check get_workflow_status once it answers again, and never perform those steps yourself). Without it, the remaining steps are recorded as 'not_executed' and the result carries outcome='dispatch_required' with a 'pending_dispatch' list for you to perform (see run_workflow); the workflow then never reaches 'completed'. Returns: Updated workflow state after resuming.

Parametersapproverworkflow_idrequiredacknowledge_not_executed

rollback

[WRITE] Abort a workflow and rollback completed steps in reverse order. Without confirm=True this only previews: it returns blast_radius — the workflow's id, type and state, the executed steps whose rollback_tool would run with its rollback_params, secrets redacted (would_roll_back — these often carry confirm=True, and this call's confirm=True is the decision to run them), the executed steps that have none and stay applied (left_in_place), steps you performed from pending_dispatch that Pilot will not reverse (not_reversed_by_pilot: they have an undo you must call; not_reversible_outside_pilot: they have none — a clone, a production resize), undos that would leave something behind (leaves_behind on a would_roll_back entry), steps with unknown effects, and blockers — and changes nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked for a rollback earlier — the user has not seen the preview yet. Nothing rolls back automatically: a failed step leaves the workflow 'failed' and stops. This tool is the explicit, best-effort undo, and it only reverses steps pilot itself recorded as 'success' — without --dispatch, approval gates only. Steps YOU performed from pending_dispatch are 'not_executed' (or 'reported_done' once acknowledged at a gate) here, so to undo them call each one's rollback_tool with its rollback_params yourself, last step first. Embedders that pass a dispatcher to WorkflowExecutor get those calls made for them. Steps without a rollback_tool are reported 'not_reversible' and stay applied; an undo that does not remove what the step created is 'partial' (a clone powered off stays). A failed undo does not stop the rest. The workflow state is set to 'failed' afterwards. Refused with confirm=True: a workflow in draft, completed, rolling_back or cancelled state, a step whose status Pilot does not recognise, a workflow record that cannot be read, and — unless acknowledge_unknown_effects=True — a

Parametersconfirmworkflow_idrequiredacknowledge_unknown_effects

cancel_workflow

[WRITE] Cancel a workflow — move it to the terminal CANCELLED state. Use this when an approval is REJECTED, a review flags the plan as unsafe, or an operator decides the workflow must never run. A cancelled workflow is dead: run_workflow and approve refuse to execute it. Without this, an approval-rejected PENDING workflow could still be picked up and run. Without confirm=True this only previews: it returns blast_radius — the workflow's id, type and state, the executed steps that stay applied (left_in_place: cancelling part-way leaves a half-applied change), steps performed outside Pilot (performed_outside_pilot), steps already handed to you in pending_dispatch that cancel can neither stop nor undo (handed_out_to_caller), the steps that would be skipped (would_skip), steps with unknown effects, and blockers — and changes nothing. Show that to the user and get their explicit decision. Do not set confirm=True on your own because the user asked to cancel earlier — the user has not seen the preview yet. Cancel only stops FUTURE steps. It does NOT undo already-completed steps — use rollback() to reverse those. Refused with confirm=True: an already completed/failed/cancelled workflow, a step whose status Pilot does not recognise, a workflow record that cannot be read, and — unless acknowledge_unknown_effects=True — a step left 'running' or 'interrupted' (listed in unknown_effects). The cancellation is written to the workflow audit log. Returns: Preview: {"action": "preview", "blast_radius", "hint"}. Acting: the workflow state (state='cancelled', outcome='cancelled', action='cancelled') with blast_radius, or an error if refused.

Parametersreasonconfirmworkflow_idrequiredacknowledge_unknown_effects

review_workflow

[READ] Sanity-check a planned workflow before execution. Performs structural validation only — does NOT call into other skills. Catches the common authoring errors before they hit production: - Delete-then-use: a step deletes resource X, a later step references X - Missing required params: a step has empty params or placeholder values - Cross-skill order issues: surfacing the cross-skill dispatch sequence - Risk profile: count of destructive / write / read-only / unclassified steps - Approval coverage: is every destructive OR unclassifiable step gated behind a preceding require_approval? Each step is placed in a tier from the tool's entry in ``get_skill_catalog`` first, then from name patterns. A step that matches neither is reported as ``ungated_unclassified`` rather than assumed safe: pilot dispatches nothing itself and cannot inspect a sibling skill's annotations, so "this tool is unknown to me" is the honest finding, and it needs the same gate a known destructive step does. The remedy is in the message — add the tool to SKILL_CATALOG with the risk its own skill declares, or add a gate. Medium-risk writes (create / scale / enable) are classified and counted but not gated: the family gates destructive work, and several built-in templates deliberately create in staging *before* asking for approval. Returns: Dict with keys: - ``verdict``: ``"approved"`` if no structural issues, otherwise ``"needs_revision"`` - ``findings``: list of {severity, kind, message, step_index}. Kinds ``ungated_destructive``, ``ungated_unclassified`` and ``destructive_in_parallel_group`` are what ``run_workflow`` refuses on; ``force=True`` overrides that only for a built-in template, never for a custom workflow's missing approval gate. - ``summary``: counts — total/destructive/write/read_only/approval_gates, parallel_groups, est_duration_min, plus ``classified_steps`` and ``unclassified_steps`` so an "a

Parametersworkflow_idrequired

get_workflow_status

[READ] Get current workflow state, diff report, and audit log. Use this to poll a workflow after run_workflow and to find out why one stopped: steps with status 'not_executed' are yours to perform (the server runs without --dispatch), state 'awaiting_approval' means call approve. Returns a point-in-time snapshot and does not advance the workflow. Returns: Full workflow state including steps, audit log, and diff report.

Parametersworkflow_idrequired

list_workflows

[READ] List all available workflow templates (built-in + custom). Use this first to see whether a template already covers the goal, then pass its name to create_workflow_from_template; if none fit, use create_workflow instead. Built-in templates are always available. Custom templates are loaded from ~/.vmware/workflows/*.yaml — drop a YAML file there to add your own workflows. Returns: dict with builtin and custom workflow lists, each with name, description, steps count, plus active_workflows — the IDs of in-flight runs to pass to get_workflow_status.

Takes no parameters.

get_skill_catalog

[READ] Get the complete catalog of available skills and tools for workflow design. Use this to understand what building blocks are available when designing a custom workflow, then feed the skill and tool names into create_workflow or update_draft steps. Note this is a static curated catalog, not a live query of each skill's registry, so it may lag a skill's actual tool list; pilot cannot call these tools itself — the calling agent does. Returns: dict mapping skill name → {description, tools: {tool_name: {risk, desc}}}.

Takes no parameters.

Version history

10
  1. v2.4.1LatestNov 1, 2026
  2. v2.4.0Oct 18, 2026
  3. v2.3.0Oct 16, 2026
  4. v2.2.0Oct 15, 2026
  5. v2.1.0Oct 15, 2026
  6. v2.0.0Oct 15, 2026
  7. v1.13.0Oct 14, 2026
  8. v1.12.1Oct 13, 2026
  9. v1.12.0Sep 19, 2026
  10. v1.11.1Sep 16, 2026

Score

80% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.

Other Pilot integrations