OBSBOT Tiny 2 Camera Control
NPM · OBSBOT-MCP
Control an OBSBOT Tiny 2 camera: pan/tilt/zoom, AI tracking, focus, exposure, snapshots, recording
Available components
Last scanned (13 hours ago)
Scores higher than 93% of npm servers
Category IoT and Hardware
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. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to lxman/obsbot-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability69
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 9188 tokens (~112/item across 82 items; 82 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "obsbot_preset_update" implies "overwrite" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 82 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Checks we ran (16)
- Malware scan
- Known CVEs
- Install scripts
- Dependency health
- Source repository
- Provenance
- License
- Maintenance
- Security disclosure
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this package (2)
- Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
- Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Package version: 0.9.5 → 0.9.6 functional
- 4 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- Package version: 0.6.3 → 0.9.5 functional
- 3 Nov 26 −10
- Malware scan: pass → unverified ▼ security
- CVE-2023-54404 no longer affects this package ▲ security
- Known CVEs: fail → pass ▲ security
- Package version: 0.9.3 → 0.9.5 functional
- Package version: 0.9.3 → 0.9.4 functional
- 1 Nov 26 0
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Package version: 0.9.2 → 0.9.3 functional
- Package version: 0.6.3 → 0.9.3 functional
- 24 Oct 26 −5
- CVE-2023-54404 affects this package: high ▼ security
- Known CVEs: pass → fail ▼ security
- 18 Oct 26 0
- Stability: 0.97 → pass security
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/obsbot-mcp@0.9.6
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | lxman/obsbot-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/lxman/obsbot-mcp/.github/workflows/release.yml@refs/tags/v0.9.6 |
| Rekor log index | 3697770277 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:fc74d66f0b36b5d89aa520ea21b749c3d7fdd5ec493a7bf358befcb43cf6c6d85db2f4d02e410209408e54f4c2542c18dc3c806944a834fb7ba4f30a4 |
Background: How many MCP packages publish verified provenance →
Dependencies 93 packages
| Packages resolved | 93 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
obsbot_ai_track ~145
Enable or disable AI tracking and choose the mode. When enabled the camera follows the subject; disabling stops tracking. `mode` is either a human framing (normal | upper-body | close-up | headless | lower-body) or a standalone scene mode (group | whiteboard | desk | hand); scene modes imply enabled:true. After writing, the tool polls the status block until the mode settles and returns { verified, matched } — the aiMode the device actually landed on (matched:false means no subject was being tracked, so the mode could not take effect yet).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enabled | boolean | yes | – |
| mode | string | – | – |
No output schema declared.
No examples provided.
obsbot_ai_track_speed ~57
Set the AI tracking-speed preset (OBSBOT Center's Standard/Sport). speed: standard (slower follow) | sport (snappier follow).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| speed | string | yes | – |
No output schema declared.
No examples provided.
obsbot_aim_at_pixel ~407
Point the camera at a specific pixel in a frame you just captured. Give the pixel's x/y and the frameWidth/frameHeight from THE SAME obsbot_capture_snapshot result — mixing a pixel from one frame with dimensions from another aims at the wrong place and cannot be detected. `source` DECLARES which feed the frame came from (default device); it cannot be inferred from the pixels. A virtual or ndi frame is accepted, but only aims correctly if that feed is an unmodified pass-through of the camera — a compositor's rescale or letterbox is invisible in the picture and silently wrong here — so a non-device declaration comes back with that assumption stated. Takes no field-of-view or zoom argument: it reads the camera's magnification from its reported state, a discrete FOV mode or a continuous zoom alike, so it works at any zoom. Refuses when AI tracking is active (tracking moves the gimbal itself and would fight the aim), when the FOV mode can't be decoded, or when a corrupt zoom reading would resolve to an implausible magnification, so it never aims on an assumption it cannot check. If the camera was asleep, waking it moves the gimbal and invalidates the frame you measured, so the call refuses instead of aiming on stale geometry — take a fresh snapshot and retry. Returns clamped:true if the target was outside the gimbal's range; the camera still moves, to the nearest reachable pose. Refuses (ok:false) instead of moving when the pixel lies past vertical from the current pose — reachable only by an "over the top" rotation that would swing the camera toward the opposite side of the room, not toward the target; tilt toward the pixel first, then re-aim.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| frameHeight | number | yes | – |
| frameWidth | number | yes | – |
| source | string | – | – |
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
obsbot_capture_list ~29
List active recording/preview sessions (id, kind, source, output path, start time).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
obsbot_capture_preview ~73
Open a live preview window of the camera (for the user to watch). NOTE: before calling, ensure the camera is focused (call obsbot_focus_auto for autofocus) unless otherwise directed. source: device|virtual|ndi. Returns a sessionId for obsbot_capture_stop.
| Name | Type | Req | Description |
|---|---|---|---|
| source | string | – | – |
No output schema declared.
No examples provided.
obsbot_capture_record ~147
Start recording the camera to an MP4 (for the user). durationSec optional (open-ended recordings auto-stop after 60 min); audio defaults to on (the OBSBOT mic); outputPath optional (defaults to ~/Videos/OBSBOT on every platform, including macOS, where that is NOT the usual ~/Movies). NOTE: before calling, ensure the camera is focused (call obsbot_focus_auto for autofocus) unless otherwise directed. source: device|virtual|ndi. Returns a sessionId for obsbot_capture_stop.
| Name | Type | Req | Description |
|---|---|---|---|
| audio | boolean | – | – |
| durationSec | number | – | – |
| outputPath | string | – | – |
| source | string | – | – |
No output schema declared.
No examples provided.
obsbot_capture_snapshot ~162
Grab one still frame from the camera and return it as an image (for you to see and for framing/lighting/exposure checks). resolution is the longest edge in pixels, 256-1920, default 640 — larger images cost proportionally more tokens, so ask for more only when you need the detail. NOTE: before calling, ensure the camera is focused (call obsbot_focus_auto for autofocus) unless otherwise directed. source: device (default) | virtual | ndi. If the camera is in use by another app, returns a message instead of an image.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| quality | number | – | – |
| resolution | number | – | – |
| settleMs | number | – | – |
| source | string | – | – |
No output schema declared.
No examples provided.
obsbot_capture_stop ~42
Stop a recording or preview session by its sessionId. Recordings are stopped gracefully so the MP4 finalizes correctly.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | yes | – |
No output schema declared.
No examples provided.
obsbot_devices ~130
List attached OBSBOT-compatible cameras. Each entry is { serial?, locationId?, name, status, reason? }: serial is the value to pass as `camera` to any camera-addressing tool (present where obtainable — reading it requires briefly opening the camera); status is available (free to bind), bound (already opened by this process), or busy (could not be opened and identified, so it can't be targeted here — usually another process holds it, but it also covers a camera that opened yet would not answer). On a busy entry, `reason` carries the underlying error and distinguishes those cases.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
obsbot_focus_auto ~21
Enable continuous autofocus.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_focus_face ~32
Enable or disable face-priority autofocus.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enabled | boolean | yes | – |
No output schema declared.
No examples provided.
obsbot_focus_manual ~45
Set the focus motor to position (0-100, near→far), mapped onto the device range.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| position | number | – | – |
No output schema declared.
No examples provided.
obsbot_gimbal_move ~98
Move the gimbal to an absolute yaw/pitch angle (degrees); positive yaw pans to the camera's left, positive pitch tilts down. Yaw is clamped to [-130,130], pitch to [-90,90]. Absolute positioning (1:1 degrees), verified on hardware.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| pitch | number | yes | – |
| roll | number | – | – |
| yaw | number | yes | – |
No output schema declared.
No examples provided.
obsbot_gimbal_position ~112
Read the gimbal's current absolute yaw/pitch in degrees (positive yaw = camera's left, positive pitch = down) via the standard UVC Pan/Tilt controls. This is a live hardware readout accurate to ±1°, reported rounded to 2 decimal places (finer digits would be noise, not precision): it is valid during a move as well as after one, and reflects motion the host did not command (speed moves, recenter, tracking).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_gimbal_recenter ~75
Recenter the gimbal — drives it back to yaw 0 / pitch 0 (level and facing forward). Returns as soon as the command is sent: the gimbal may still be moving, so poll obsbot_gimbal_position if you need to know it has arrived.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_image_adjust ~133
Adjust a standard image control: control is brightness | contrast | hue | saturation | sharpness | gain | backlight-compensation; level 0-100 is mapped onto the device's supported range for that control. Standard UVC (IAMVideoProcAmp), no auto. NOTE: `gain` and `backlight-compensation` are NOT implemented on the Tiny 2 — it reports them as zero-length controls — so they are refused with an error rather than silently doing nothing. The other five work.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| control | string | yes | – |
| level | number | yes | – |
No output schema declared.
No examples provided.
obsbot_image_exposure_auto ~104
Enable auto-exposure. Optional priority 'global' | 'face' selects the metering region (face-priority meters for a detected face). Uses the proprietary V3 frame protocol (CAM_SET_EXPOSURE_TINY2, which carries mode and value in one command) because the standard UVC/IAMCameraControl V4L2 path is a stub on the Tiny 2.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| priority | string | – | – |
No output schema declared.
No examples provided.
obsbot_image_exposure_manual ~126
Set exposure level 0-100 (0 darkest → 100 brightest), mapped onto the device's exposure range. Also returns `raw`: the device-native exposure value the level mapped to, for diagnostics — `level` is the number to reason with. Uses the proprietary V3 frame protocol (CAM_SET_EXPOSURE_TINY2, which carries mode and value in one command) because the standard UVC/IAMCameraControl V4L2 path is a stub on the Tiny 2.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| level | number | – | – |
No output schema declared.
No examples provided.
obsbot_image_fov ~52
Set the field of view. fov: wide (86°) | medium (78°) | narrow (65°).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| fov | string | yes | – |
No output schema declared.
No examples provided.
obsbot_image_hdr ~33
Toggle HDR/WDR imaging on or off.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enabled | boolean | yes | – |
No output schema declared.
No examples provided.
obsbot_image_wb_auto ~24
Enable auto white balance.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_image_wb_manual ~45
Set white balance to a colour temperature in Kelvin (clamped to the device's supported range).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| temperature | number | – | – |
No output schema declared.
No examples provided.
obsbot_preset_delete ~50
Delete preset slot 1|2|3. The slot must be occupied. Verifies by re-reading the slot list after writing.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| slot | – | yes | – |
No output schema declared.
No examples provided.
obsbot_preset_list ~74
Read the three gimbal preset slots (occupied/empty, name, pose in degrees). Reads flat XU selectors 12 (list) and 13 (entry cursor), NOT the vendor V3 framed-reply path (which is non-functional for preset data on this device).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_preset_recall ~78
Recall preset slot 1|2|3, driving the gimbal to that slot's saved pose. The slot must be occupied. The gimbal may still be moving when this returns — verification only confirms the slot is still occupied, not that the pose has arrived.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| slot | – | yes | – |
No output schema declared.
No examples provided.
obsbot_preset_rename ~73
Rename preset slot 1|2|3. The slot must already be occupied. Names longer than 40 bytes are truncated to fit the wire frame. Verifies by re-reading the slot list after writing.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| name | string | yes | – |
| slot | – | yes | – |
No output schema declared.
No examples provided.
obsbot_preset_save ~92
Save the gimbal's current live pose (yaw/pitch, via the standard UVC Pan/Tilt controls) into preset slot 1|2|3. Slots are create-once on this device — there is no overwrite, so an occupied slot is rejected (delete it first). Verifies by re-reading the slot list after writing.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| slot | – | yes | – |
No output schema declared.
No examples provided.
obsbot_preset_update ~79
Overwrite preset slot 1|2|3 with the gimbal's current live pose (yaw/pitch via the standard UVC Pan/Tilt controls). The slot must already be occupied (save first to create it). Verifies by re-reading the slot list after writing.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| slot | – | yes | – |
No output schema declared.
No examples provided.
obsbot_sleep ~80
Sleep the camera/gimbal (sends "sleep"). This MOVES the camera: sleeping STOWS the gimbal, tilting it face-down to roughly pitch 84°, so obsbot_gimbal_position will read ~84 rather than the pose you left it in. obsbot_wake un-stows it.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_status ~289
Read the camera's live status block. Returns { awake, hdr, faceAe, aiMode, trackSpeed, fovMode, zoomPercent, focusMode, focusPosition }: faceAe is whether auto-exposure is metering for a detected face; aiMode is the current AI framing (no-tracking|normal|upper-body|close-up|headless|lower-body|desk|whiteboard|hand|group|unknown); trackSpeed is standard|sport|unknown; fovMode is the field-of-view mode (wide|medium|narrow|custom|unknown), where custom means a continuous zoom overrode the discrete modes; zoomPercent is the zoom position, 0-100; focusMode is auto|manual|unknown. focusPosition is present ONLY in manual mode, on the same 0-100 scale obsbot_focus_manual takes: under autofocus this camera does not expose the motor, it echoes the last written value, so reporting it would look like a live focus distance while being stale. Focus is a standard UVC control rather than a field of the status block, so it costs an extra read; a device that cannot answer it reports focusMode unknown rather than failing the whole read. Under --debug the result also carries `raw`: the full 60-byte status block as hex (for reverse-engineering undecoded offsets).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_af_track ~66
Read or set the autofocus track mode: global, face or front (Center's radios; `face` measured on the wire, the other two are the presumed strings). Readback-verified write.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| mode | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_ai_track ~140
Enable or disable a Tail 2's AI tracking. enabled:false stops tracking (mode `none`). enabled:true starts the chosen mode — default humanTrackingSingleMode (single-person framing, the camera's power-on default); also group human framing, animal tracking, and object tracking (the mode strings are the camera's own enum). NOTE: while tracking is active it owns the gimbal — manual moves fight it, and a recenter can drop tracking to none. Mode strings verified against firmware 7.2.13.1.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enabled | boolean | yes | – |
| mode | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_antiflicker ~61
Read or set the anti-flicker mode: off, 50hz or 60hz (60hz measured on this unit). Readback-verified write.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| mode | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_audio ~66
Read (bare call) or set the Tail 2's audio input: volume 0-100 and mute. Changes apply to the encoded/recorded audio stream.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| mute | boolean | – | – |
| volume | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_auto_zoom_speed ~100
Set the AUTO zoom speed 1-10 — how fast AI-tracking auto-zoom framing moves (Center's Console slider; distinct from the MANUAL zoom speed on obsbot_tail2_zoom's speed param). Rides UDP 9999 key 0x17. No REST-readable state; no ack — the frame is synthesized and works with Center closed.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| speed | integer | yes | – |
No output schema declared.
No examples provided.
obsbot_tail2_capture_photo ~77
Trigger a still-photo capture on the Tail 2 (POST capture/trigger). Needs storage (SD card — check obsbot_tail2_status's sdcard field). The ack means the camera accepted the trigger; the photo lands on the card (see obsbot_tail2_status / album).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_devices ~87
List registered OBSBOT Tail 2 cameras (network cameras; MAC-keyed). Each entry: mac (the identity — pass it as `camera` to any obsbot_tail2_* tool), name, and the host(s) it has answered on. Registration is not liveness: an offline camera still appears here; use obsbot_tail2_status to check one is reachable.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
obsbot_tail2_export_log ~95
Download the camera's full diagnostic bundle (GET /camera/test/log — the same archive OBSBOT Center's Export Log button produces) and save it to `path`. ~12 MB tar.gz containing the settings tree (ust.json), the runtime status snapshot, factory records, kernel logs. Takes ~10-20 s (server-side archive generation).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
obsbot_tail2_exposure ~187
Read (bare call) or set the Tail 2's exposure. mode manual|auto; in AUTO: face (face-priority AE, global|face) and evbias (-3.0..3.0, ~0.3 steps); in MANUAL: iso (100-6400) and shutter ("1/N", 1/6400..1/30). Manual values only exist in manual mode and face/evbias only in auto — a bare call reports whichever set the current mode exposes. Note: the camera's manual ISO granularity is finer than the doc claims (a live-AE value like 894 reads back).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| evbias | number | – | – |
| face | boolean | – | – |
| iso | number | – | – |
| mode | string | – | – |
| shutter | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_focus ~104
Read (bare call) or set the Tail 2's focus: mode afc|afs|mf, and position (0-100, the focus motor) which is only valid in mf — the camera errors on it in afc/afs and this tool refuses rather than trigger that. Bare call reports the mode, and the position when in mf.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| mode | string | – | – |
| position | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_focus_point ~119
Tap-to-focus: move the focus window to a normalized frame coordinate (x/y 0.01-0.99, top-left ~0,0) AND start a point focus there. Effective in afc/afs focus modes only — in mf the motor position is the tool (obsbot_tail2_focus). Bare call reads the current window. Divide a snapshot pixel by frameWidth/frameHeight and pass it straight in.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| x | number | – | – |
| y | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_gesture ~120
Read (bare) or set the gesture-control switches and the gesture zoom factor: lockedTarget, recording, zoom (booleans) and zoomFactor (the multiplier one zoom gesture applies, e.g. 2.0). All measured on the wire 2026-10-01. Writes are readback-verified; each field is optional.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| lockedTarget | boolean | – | – |
| recording | boolean | – | – |
| zoom | boolean | – | – |
| zoomFactor | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_gimbal_invert ~62
Read or set the Tail 2's control-direction inversion (gimbalinvert). Call with no arguments to read; pass enable to write (verified by readback).
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enable | boolean | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_gimbal_move ~161
Move the Tail 2's gimbal to an absolute yaw/pitch in degrees — the Tail 2's pose-record convention (obsbot_tail2_gimbal_position reports the same axes). There is no move-to-angle endpoint in the API, so this is a closed loop over the speed primitive: jog, read the pose (each read ~2s), correct, up to 5 rounds, tolerance ±1.5°. Slow by design — expect ~5-15s. REFUSES while AI tracking is active (tracking drives the gimbal itself and would fight the loop); obsbot_tail2_ai_track enabled:false first.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| pitch | number | – | – |
| yaw | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_gimbal_position ~121
Read the Tail 2's live gimbal pose in degrees (yaw/pitch/roll) plus the zoom ratio. The API has no direct pose read — this works by saving the current pose into an empty preset slot, reading it back, and deleting the slot (takes ~2s). Requires at least one empty preset slot: overwriting a preset is irreversible (no pose-by-value write exists to restore it). Leftover 'pose-probe' slots from crashed reads are deleted, not trusted.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_gimbal_speed ~182
Jog the Tail 2's gimbal: per-axis SPEED (sign = direction, magnitude = speed, ±150 of the firmware's ±178 range) with an automatic stop after durationMs (default 500, max 5000). This is the joystick primitive (POST ptz/gimbalcontrol) — there is no absolute move endpoint, so the camera moves continuously until stopped; this tool always stops it. Measured: command 20 ≈ 7.9°/s, and a POSITIVE yaw command DECREASES the recorded yaw (obsbot_tail2_gimbal_position's convention). Disable AI tracking first or it will fight the move.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| durationMs | integer | – | – |
| pitch | number | – | – |
| roll | number | – | – |
| yaw | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_hdr ~42
Read (bare call) or set (enabled) the Tail 2's HDR.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enabled | boolean | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_hybrid_zoom ~233
Unlock (or re-lock) the Tail 2's hybrid digital zoom — the control OBSBOT Center owns. Out of the box the camera's advertised 12x range is walled at its 5x OPTICAL ceiling across the entire REST API: PUT ptz/zoom above 5.0 is acknowledged but silently pins at 5.0. Center unlocks the 5-12x digital region through its private UDP 9999 protocol; this tool speaks that protocol directly (both checksums decoded — the synthesizer reproduces Center's captured frames byte-for-byte; TAIL2-PROTOCOL.md §10). Verified by readback from the live status snapshot (zoom_infos.digital_enable); returns settled:false if the readback hadn't caught up — behavioral double-check: obsbot_tail2_zoom ratio 6.0 settles above 5.0 only when enabled. Works with OBSBOT Center closed. Hardware-verified both directions 2026-09-30, including full synthesis with a fresh sequence number.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| enabled | boolean | yes | – |
No output schema declared.
No examples provided.
obsbot_tail2_image_adjust ~155
Read (bare call) or set the Tail 2's image style: brightness/contrast/hue/saturation/sharpness, each an absolute 0-100, plus styleMode standard|outdoor|pastel|manual. Individual control writes are MODE-GATED (measured): they apply only in styleMode manual — HTTP 500 "style mode is not manual" otherwise — so this tool applies a given styleMode FIRST and refuses a control write in a preset mode. A styleMode switch preserves the current values. Bare call returns the full style bundle.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
| control | string | – | – |
| styleMode | string | – | – |
| value | number | – | – |
No output schema declared.
No examples provided.
obsbot_tail2_info ~94
Read a Tail 2's identity and static configuration in one call: device_info (name, MAC, wired/wireless IPs), range (zoom 1.0–12.0, focus 1–100, exposure, white balance 2000–10000K, image adjust ranges), and networkconfig (NDI/stream encoder settings). Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| camera | string | – | – |
No output schema declared.
No examples provided.
How do I install the OBSBOT Tiny 2 Camera Control MCP server?
OBSBOT Tiny 2 Camera Control runs locally as an npm package, launched with npx -y obsbot-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · obsbot-mcp
claude mcp add lxman-obsbot-mcp -- npx -y obsbot-mcp
What is the OBSBOT Tiny 2 Camera Control MCP server?
OBSBOT Tiny 2 Camera Control is an MCP server listed in the public MCP registry as io.github.lxman/obsbot-mcp. Control an OBSBOT Tiny 2 camera: pan/tilt/zoom, AI tracking, focus, exposure, snapshots, recording. This page covers its npm package (obsbot-mcp).
Is the OBSBOT Tiny 2 Camera Control MCP server safe to use?
OBSBOT Tiny 2 Camera Control scores 89 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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 OBSBOT Tiny 2 Camera Control MCP server expose?
OBSBOT Tiny 2 Camera Control exposes 82 tools: obsbot_devices, obsbot_wake, obsbot_sleep, obsbot_gimbal_move, obsbot_gimbal_recenter, and 77 more. Their descriptions and schemas cost roughly 9,188 tokens of context every time the server is loaded.
Is the OBSBOT Tiny 2 Camera Control MCP server still maintained?
OBSBOT Tiny 2 Camera Control is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the OBSBOT Tiny 2 Camera Control MCP server under?
OBSBOT Tiny 2 Camera Control declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.
What did VerifyMCP test on the OBSBOT Tiny 2 Camera Control MCP server?
VerifyMCP ran 16 checks on OBSBOT Tiny 2 Camera Control, covering Malware scan, Known CVEs, Install scripts, Dependency health and 12 more. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.