# OTInstaller (mcpb · ot_0.16.1_linux_amd64.mcpb)

Install and run open-source OSINT tools in a local sandbox, asking before runs that touch a target.

- Trust score: 48/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- mcpb · `ot_0.16.1_darwin_amd64.mcpb`: 9/100, [markdown](https://verifymcp.io/servers/com-otinstaller-ot/ot-darwin-amd64.md), [page](https://verifymcp.io/servers/com-otinstaller-ot/ot-darwin-amd64)
- mcpb · `ot_0.16.1_darwin_arm64.mcpb`: 9/100, [markdown](https://verifymcp.io/servers/com-otinstaller-ot/ot-darwin-arm64.md), [page](https://verifymcp.io/servers/com-otinstaller-ot/ot-darwin-arm64)
- mcpb · `ot_0.16.1_linux_amd64.mcpb`: 48/100 (this document), [markdown](https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-amd64.md), [page](https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-amd64)
- mcpb · `ot_0.16.1_linux_arm64.mcpb`: 9/100, [markdown](https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-arm64.md), [page](https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-arm64)
- mcpb · `ot_0.16.1_windows_amd64.mcpb`: 9/100, [markdown](https://verifymcp.io/servers/com-otinstaller-ot/ot-windows-amd64.md), [page](https://verifymcp.io/servers/com-otinstaller-ot/ot-windows-amd64)
- mcpb · `ot_0.16.1_windows_arm64.mcpb`: 9/100, [markdown](https://verifymcp.io/servers/com-otinstaller-ot/ot-windows-arm64.md), [page](https://verifymcp.io/servers/com-otinstaller-ot/ot-windows-arm64)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/OTInstaller/ot/releases/download/v0.16.1/ot_0.16.1_linux_amd64.mcpb`
- Version: `0.16.1`
- Transport: `stdio`
- SHA-256: `a1780763ad49f65213b01f0fe0608cd4f7cddfda1360f504d416de31972e56f4`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 10 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2956 tokens (~92/item across 32 items; 25 tools + 7 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 47/100
  - Stability observed for 14 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 98/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 95% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 27 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the OTInstaller MCP server?

OTInstaller ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, a1780763ad49f65213b01f0fe0608cd4f7cddfda1360f504d416de31972e56f4; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/OTInstaller/ot/releases/download/v0.16.1/ot_0.16.1_linux_amd64.mcpb`
- SHA-256: `a1780763ad49f65213b01f0fe0608cd4f7cddfda1360f504d416de31972e56f4`

### Verify on macOS / Linux

```bash
echo "a1780763ad49f65213b01f0fe0608cd4f7cddfda1360f504d416de31972e56f4  ot_0.16.1_linux_amd64.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\ot_0.16.1_linux_amd64.mcpb).Hash -eq "a1780763ad49f65213b01f0fe0608cd4f7cddfda1360f504d416de31972e56f4"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 47, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 46, +1)

No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 45, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 44, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 43, +1)

- [functional] Package version: 0.15.0 → 0.16.1
- [functional] Package version: 0.15.0 → 0.16.0

### 2026-10-23 (score 42, 0)

- [functional] Package version: 0.13.1 → 0.15.0
- [functional] Package version: 0.13.1 → 0.14.0

### 2026-10-22 (score 42, +1)

- [security regression] Tool safety: pass → unverified
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional improvement] Stability: unverified → 0.03
- [functional] Package version: 0.13.0 → 0.13.1

## MCP tools (25)

### `cancel_run` (~48 tokens)

Stop a run

Stop a run or batch this session started. Partial output is kept. A run that already ended is left alone and its status returned.

Input parameters:

- `id` (string, required): a run_id or batch_id

Output parameters:

- `already_finished` (boolean)
- `id` (string)
- `status` (string)

### `detect_type` (~57 tokens)

Detect a target's type

What kind of target a string is, as ot auto would guess: url, ip, email, phone, domain, else username.

Input parameters:

- `target` (string, required): a username, domain, email address, phone number, IP address or URL

Output parameters:

- `input_type` (string)
- `prefix` (string): the ot run shorthand, such as d: for a domain

### `diff_runs` (~66 tokens)

Compare two runs

What changed between the two most recent saved runs of a tool against a target: entities and output lines added and removed.

Input parameters:

- `case` (string)
- `target` (string, required): the target both runs were against
- `tool` (string, required): the tool, namespace/name or name

Output parameters:

- `added` (null|array)
- `added_entities` (null|array)
- `newer_date` (string)
- `newer_file` (string)
- `older_date` (string)
- `older_file` (string)
- `removed` (null|array)
- `removed_entities` (null|array)

### `doctor` (~26 tokens)

Check this machine

Whether Docker (or Podman), cosign, the keychain and the registry are available.

Output parameters:

- `checks` (null|array)
- `ok` (boolean)

### `extract_indicators` (~58 tokens)

Extract indicators

Emails, domains, IP addresses, URLs and entities found across a tool's saved runs, or a case's.

Input parameters:

- `case` (string): scan the runs in this case
- `tool` (string): scan this tool's saved runs

Output parameters:

- `domains` (null|array)
- `emails` (null|array)
- `entities` (object)
- `ips` (null|array)
- `urls` (null|array)

### `get_batch` (~67 tokens)

Read a batch

The rows of a run_all or run_playbook batch: each tool's status, entity count, first entities and run_id. While it runs, finished rows are filled in and the rest are pending.

Input parameters:

- `batch_id` (string, required): the batch_id from run_all or run_playbook

Output parameters:

- `batch_id` (string)
- `case` (string)
- `note` (string)
- `rows` (null|array)
- `status` (string): running, complete (every run completed), failed, interrupted or planned (dry_run)
- `summary` (object)

### `get_consent_status` (~202 tokens)

Check whether a run needs consent

What would happen if run_tool were called with these arguments: allowed without asking, the person asked, or refused (and why). Asks nobody and runs nothing.

Input parameters:

- `case` (string): save the run under this case, to group an investigation's runs
- `consent_token` (string): only after the person said yes to the summary of a consent_required error for this exact call
- `input_type` (string): the type of target (email, username, domain, ...); guessed when left out
- `inputs` (object): input values by input name; get_tool lists the inputs
- `target` (string): instead of inputs: one target, filled into the tool's input of input_type
- `tool` (string, required): the installed package, namespace/name
- `wait_seconds` (integer): how long to wait for the result before returning a run_id to poll with get_run (default 60, at most 300)

Output parameters:

- `class` (string)
- `effects` (null|array)
- `reason` (string)
- `verdict` (string): allow: runs without asking; ask: the person will be asked; refuse: it won't run

### `get_playbook` (~39 tokens)

Get a playbook

One playbook: the input types it is for, its tools and which are installed.

Input parameters:

- `name` (string, required): the playbook's name

Output parameters:

- `case` (string)
- `description` (string)
- `inputs` (null|array): the input types it is meant for, the main one first; empty when the playbook doesn't say
- `name` (string)
- `source` (string)
- `tools` (null|array)

### `get_run` (~146 tokens)

Read a saved run

A run's result: its status and provenance, the entities it found (paged), a deduplicated summary of the indicators, or its raw output. Also reports runs still going.

Input parameters:

- `include_raw` (boolean): also return the tool's raw output, cut to fit
- `limit` (integer): entities per page, 1 to 200 (default 50)
- `offset` (integer)
- `run_id` (string, required): the run, from run_tool, list_runs or a batch
- `view` (string): entities (default): the entities, paged; summary: emails, domains, IPs, URLs and entity values found, deduplicated

Output parameters:

- `artifact` (null|object)
- `entities` (null|array)
- `entities_total` (integer)
- `note` (string)
- `offset` (integer)
- `output_sha256` (string)
- `raw` (string)
- `raw_cut` (boolean)
- `run` (object)
- `summary` (null|object)
- `warnings` (null|array)

### `get_tool` (~75 tokens)

Get a tool

Everything needed to run a tool: its inputs (names, types, defaults), what it finds, the API keys it needs and whether they are set, its ethics flags and network access, and whether a run will need the person's consent. Works for installed and registry tools.

Input parameters:

- `tool` (string, required): the package as namespace/name

Output parameters:

- `consent_class` (string): passive runs need no consent; networked, target and personal runs ask the person
- `deprecated` (string)
- `effects` (null|array): what a run does, in plain words
- `ethics` (null|object)
- `homepage` (string)
- `inputs` (null|array)
- `installed` (null|object)
- `license` (string)
- `network` (null|object)
- `outputs` (null|array)
- `outputs_detail` (null|array): what the tool's entities carry: descriptions and attributes, when the publisher gives them
- `ref` (string)
- `registry` (null|object): the registry's listing: signed, verified publisher, health, installs
- `run_tool_example` (object)
- `secrets` (null|array)
- `summary` (string)
- `test_input` (object)
- `timeout_seconds` (integer)
- `typical_seconds` (integer): how long a run usually takes
- `unavailable` (string)
- `version` (string)

### `install_tool` (~151 tokens)

Install a tool

Install a published tool: pull its Docker image by digest and verify its cosign signature, or fetch its Python wheel by SHA-256 and build it into a sandbox image. Agents can't install yanked, failed, broken or local packages, or a Docker image whose signature can't be verified. On an installed tool it updates to the latest version (or the one named), saying so when it asks, but never moves a version the person held. Asks the person first unless the policy allows installs.

Input parameters:

- `consent_token` (string): only after the person said yes to the summary of a consent_required error for this exact call
- `tool` (string, required): the package, namespace/name or namespace/name@version

Output parameters:

- `artifact` (string)
- `from_backup` (boolean)
- `held` (boolean)
- `installed_at` (string)
- `native` (boolean)
- `previous` (string): the version an update replaced
- `ref` (string)
- `runtime` (string)
- `signer` (string)
- `status` (string): installed, updated or already_installed
- `version` (string)

### `key_setup` (~96 tokens)

Help the person set up API keys

The API keys the named tools (or all installed tools) declare: what each is, where to get it, what it costs, whether it is set, and the command the person runs in their own terminal to store it. You can't store keys: show the person the command, and never ask them for a key's value.

Input parameters:

- `tools` (null|array): the tools, as namespace/name; all installed tools when empty

Output parameters:

- `command` (string): what the person runs in their own terminal to set the keys up
- `keys` (null|array)
- `missing` (null|array): keys that are not set yet
- `note` (string)

### `list_installed` (~54 tokens)

List installed tools

The tools installed on this machine, with their versions, the exact image digest or wheel hash, whether the person held a version, and the registry's latest version (checked at most daily) with whether an update is available.

Output parameters:

- `installed` (null|array)
- `latest_checked_at` (null|string)

### `list_playbooks` (~40 tokens)

List playbooks

Named sets of tools run together against one target, bundled or the person's own: the input types each is for, and which of their tools are installed.

Output parameters:

- `playbooks` (null|array)

### `list_runs` (~88 tokens)

List saved runs

Saved runs, newest first, optionally of one tool, against one target, or in one case.

Input parameters:

- `case` (string): only runs saved under this case
- `limit` (integer): newest first, at most this many (default 20)
- `target` (string): only runs against this target
- `tool` (string): only runs of this tool (namespace/name or name)

Output parameters:

- `runs` (null|array)

### `list_types` (~38 tokens)

List input and entity types

The input types tools take, the entity types they find and what each means, and the pivot map: which input types each entity type can feed.

Output parameters:

- `descriptions` (object)
- `entity_types` (null|array)
- `input_types` (null|array)
- `pivots` (object): which input types each entity type can feed (spec/pivots.json)

### `read_guide` (~65 tokens)

Read a guide page

One page of a guide, as Markdown, with the list of its pages and the tools it uses.

Input parameters:

- `guide` (string, required): the guide, namespace/name or namespace/name@version
- `page` (string): the page path from pages; the first page by default

Output parameters:

- `body_markdown` (string)
- `next` (string)
- `pages` (null|array)
- `path` (string)
- `ref` (string)
- `related_tools` (null|array)
- `title` (string)
- `version` (string)

### `run_all` (~236 tokens)

Run every tool on a target

Run every installed tool that takes the target (or the ones named), a few at a time, with one consent question for the whole set. Use dry_run first to see what would run. Returns a batch_id for get_batch if it takes longer than wait_seconds.

Input parameters:

- `case` (string): save the runs under this case
- `consent_token` (string): only after the person said yes to the summary of a consent_required error for this exact call
- `dry_run` (boolean): list what would run, and what would need consent, without running anything
- `input_type` (string): username, domain, email, phone, ip or url; guessed when left out
- `parallel` (integer): how many run at once (default and maximum: max_parallel in the policy)
- `target` (string, required): the target every tool runs against
- `tools` (null|array): only these installed tools (default: every installed tool that takes the target)
- `wait_seconds` (integer): how long to wait before returning a batch_id to poll with get_batch (default 60, at most 300)

Output parameters:

- `batch_id` (string)
- `case` (string)
- `note` (string)
- `rows` (null|array)
- `status` (string): running, complete (every run completed), failed, interrupted or planned (dry_run)
- `summary` (object)

### `run_playbook` (~224 tokens)

Run a playbook

Run a playbook (a named set of tools) against a target, like run_all limited to its tools. Its tools must be installed; install_tool installs them, and dry_run lists which are missing.

Input parameters:

- `case` (string): default: the playbook's own case
- `consent_token` (string): only after the person said yes to the summary of a consent_required error for this exact call
- `dry_run` (boolean): list what would run, what would need consent and what is not installed, without running anything
- `input_type` (string): username, domain, email, phone, ip or url; guessed when left out
- `name` (string, required): the playbook; list_playbooks lists them
- `parallel` (integer): how many run at once (default and maximum: max_parallel in the policy)
- `target` (string, required): the target its tools run against
- `wait_seconds` (integer): how long to wait before returning a batch_id to poll with get_batch (default 60, at most 300)

Output parameters:

- `batch_id` (string)
- `case` (string)
- `note` (string)
- `rows` (null|array)
- `status` (string): running, complete (every run completed), failed, interrupted or planned (dry_run)
- `summary` (object)

### `run_tool` (~250 tokens)

Run a tool

Run an installed tool in its sandbox and save the result. Give inputs by name, or one target with its type. Passive tools run straight away; tools that touch a target, go online, use the person's keys or involve a person ask the person first (or return consent_required with a token to use only after they say yes). Waits up to wait_seconds, then returns a run_id for get_run.

Input parameters:

- `case` (string): save the run under this case, to group an investigation's runs
- `consent_token` (string): only after the person said yes to the summary of a consent_required error for this exact call
- `input_type` (string): the type of target (email, username, domain, ...); guessed when left out
- `inputs` (object): input values by input name; get_tool lists the inputs
- `target` (string): instead of inputs: one target, filled into the tool's input of input_type
- `tool` (string, required): the installed package, namespace/name
- `wait_seconds` (integer): how long to wait for the result before returning a run_id to poll with get_run (default 60, at most 300)

Output parameters:

- `artifact` (null|object)
- `consent` (string): how the run was allowed: policy, elicitation, session, token or sandbox
- `duration_ms` (integer)
- `entities` (null|array)
- `entities_total` (integer)
- `error` (string)
- `exit_code` (null|integer)
- `note` (string)
- `output` (null|object)
- `raw` (string): the tool's output, cut to fit, when it gave no entities
- `raw_cut` (boolean)
- `run_id` (string)
- `sandbox` (boolean): true when sandbox mode ran the tool on its own test input instead of the target given
- `status` (string): running, complete, failed (the tool exited non-zero), timeout, interrupted or error
- `tool` (string)
- `truncated` (boolean): only some entities fit; read the rest with get_run
- `warnings` (null|array)

### `search_guides` (~71 tokens)

Search guides

Search the registry's investigation guides (methods, checklists, references), by words, target type or level.

Input parameters:

- `input_type` (string): guides about this kind of target
- `level` (string): beginner, intermediate or advanced
- `limit` (integer)
- `query` (string)

Output parameters:

- `next_cursor` (string)
- `results` (null|array)
- `total` (integer)

### `search_tools` (~226 tokens)

Search tools

Search the OTInstaller Registry for OSINT tools. Results list each tool's input and output types, whether it needs API keys, its ethics flags and network access, and its trust status (signed, verified publisher, health).

Input parameters:

- `category` (string): only this category, such as domain-dns or social-media
- `cursor` (string): next_cursor from the previous page
- `input_type` (string): only tools that take this input type (email, username, domain, ip, url, phone, ...); list_types lists them
- `limit` (integer): results per page, 1 to 100 (default 20)
- `no_keys` (boolean): only tools that need no API key
- `output_type` (string): only tools that find this entity type
- `passive_only` (boolean): only tools that run offline, touch no target and collect no personal data: the ones that run without asking
- `query` (string): words to search for in names, summaries and tags
- `runtime` (string): docker or pipx

Output parameters:

- `next_cursor` (string)
- `results` (null|array)
- `total` (integer)

### `suggest_pivots` (~129 tokens)

Suggest next runs

Given a saved run (or entities), list what to look at next: each entity worth pivoting on, the input type it fits, and the installed tools (and optionally registry tools) that take it. Runs nothing.

Input parameters:

- `entities` (null|array): or give entities directly, as {type, value, attrs}
- `limit` (integer): at most this many pivots (default 25)
- `registry` (boolean): also suggest tools that are not installed, from the registry (slower)
- `run_id` (string): take the entities from this saved run

Output parameters:

- `note` (string)
- `pivots` (null|array)

### `uninstall_tool` (~57 tokens)

Uninstall a tool

Remove an installed tool. Always asks the person.

Input parameters:

- `consent_token` (string): only after the person said yes to the summary of a consent_required error for this exact call
- `tool` (string, required): the installed package, namespace/name

Output parameters:

- `already_finished` (boolean)
- `id` (string)
- `status` (string)

### `validate_manifest` (~67 tokens)

Validate a manifest

Check an otinstaller.yaml as the registry will, with the same error codes. For publishers packaging a tool or guide. Give an absolute path: the server's folder is wherever the client started it.

Input parameters:

- `path` (string): the otinstaller.yaml to check (default ./otinstaller.yaml)

Output parameters:

- `problems` (null|array)
- `valid` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-amd64#diagnostics

## Score history

- 2026-11-04: 48
- 2026-11-03: 47
- 2026-11-02: 47
- 2026-11-01: 47
- 2026-10-31: 46
- 2026-10-30: 46
- 2026-10-29: 45
- 2026-10-28: 45
- 2026-10-27: 44
- 2026-10-26: 44
- 2026-10-25: 43
- 2026-10-24: 43
- 2026-10-23: 42
- 2026-10-22: 42
- 2026-10-21: 41

## Common questions

### What is the OTInstaller MCP server?

OTInstaller is an MCP server listed in the public MCP registry as com.otinstaller/ot. Install and run open-source OSINT tools in a local sandbox, asking before runs that touch a target. This page covers its MCPB bundle (https://github.com/OTInstaller/ot/releases/download/v0.16.1/ot_0.16.1_linux_amd64.mcpb).

### Is the OTInstaller MCP server safe to use?

OTInstaller scores 48 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the OTInstaller MCP server expose?

OTInstaller exposes 25 tools: cancel_run, detect_type, diff_runs, doctor, extract_indicators, and 20 more. Their descriptions and schemas cost roughly 2,576 tokens of context every time the server is loaded.

### What licence is the OTInstaller MCP server under?

OTInstaller declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/OTInstaller/otinstaller
- Website: https://otinstaller.com/docs/agents
- Changelog RSS feed: https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-amd64.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-amd64.json
- HTML version of this page: https://verifymcp.io/servers/com-otinstaller-ot/ot-linux-amd64
