Quick Checks

Quick checks

New to your camera? Start here. These are tiny, copy-paste scripts, one per operation, that let you confirm everything works before you wire up a full AI integration. Pick the Local or Cloud tab, grab a snippet, run it, and you should get an image or clip saved right next to it. If these work, you’re ready to build.

📡
Your EOT-1 must be on your network at http://eyeofthetiger.local. Run curl -fsS http://eyeofthetiger.local/docs to verify it’s reachable.
🐍
The Python MCP scripts require the mcp package. Install it with: pip install mcp httpx

HTTP API

Call the camera’s HTTP endpoints directly with curl. No dependencies beyond curl itself.

Take a snapshot

Call the HTTP endpoint directly with curl to take a snapshot and save it as image.jpg.

bash
#!/usr/bin/env bash
# Take a snapshot from a local EOT-1, saved as image.jpg.

curl -fsS http://eyeofthetiger.local/v1/snapshot -o image.jpg
echo "Saved image.jpg"

Record a clip

Request a fixed-length clip in one call and save the resulting MP4.

bash
#!/usr/bin/env bash
# Record a 10-second clip from a local EOT-1, saved as recording.mp4.

curl -fsS "http://eyeofthetiger.local/v1/clip?duration_s=10" -o recording.mp4
echo "Saved recording.mp4"

Set quality

Use the HTTP API to switch the quality preset (one tier drives stills and clips).

bash
#!/usr/bin/env bash
# Switch to low quality.

BASE="http://eyeofthetiger.local/v1"

# Check current status (includes the active quality)
curl -fsS "$BASE/status" | python3 -m json.tool

# Set quality to low
curl -fsS -X POST "$BASE/quality?level=low"

echo "Ready to capture at 854x480"

MCP server

Talk to the camera’s built-in MCP server from Python.

Capture image (Python)

Connect to the device's built-in MCP server and call take_snapshot to capture an image.

python
"""Capture a still image via the local MCP server, saved as image.jpg."""

import asyncio
import base64

from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamablehttp_client


async def main():
    # Trailing slash matters: /mcp redirects and the client won't follow it.
    async with streamablehttp_client("http://eyeofthetiger.local/mcp/") as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool("take_snapshot", {})

    for item in result.content:
        if item.type == "image":
            with open("image.jpg", "wb") as f:
                f.write(base64.b64decode(item.data))
            print("Saved image.jpg")


asyncio.run(main())

Record a clip (Python)

Use the MCP record_video tool to record a clip, then download it from the URL it returns.

python
"""Record a clip via the local MCP server, then save it as recording.mp4."""

import asyncio
import json

import httpx
from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamablehttp_client

DEVICE = "http://eyeofthetiger.local"


async def main():
    async with streamablehttp_client(f"{DEVICE}/mcp/") as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            # record_video returns a download URL, not the video itself.
            res = await session.call_tool("record_video", {"duration_s": 10})

    url = json.loads(res.content[0].text)["download_url"]
    clip = httpx.get(url, timeout=60).content
    with open("recording.mp4", "wb") as f:
        f.write(clip)
    print("Saved recording.mp4")


asyncio.run(main())

Set quality (Python)

Use the MCP set_quality tool to switch the preset, then capture.

python
"""Set quality presets via the local MCP server, then capture a still."""

import asyncio
import base64
from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamablehttp_client

DEVICE = "http://eyeofthetiger.local"


async def main():
    async with streamablehttp_client(f"{DEVICE}/mcp/") as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()

            # One preset drives both stills and clips
            await session.call_tool("set_quality", {"level": "high"})

            status = await session.call_tool("get_status", {})
            print(status.content[0].text)

            result = await session.call_tool("take_snapshot", {})

    for item in result.content:
        if item.type == "image":
            with open("image.jpg", "wb") as f:
                f.write(base64.b64decode(item.data))
            print("Saved image.jpg (4608x2592, high still quality)")


asyncio.run(main())