VigilDevelopers

Build with Vigil

Four ways in: this site’s agent API and MCP server, the local engine on the Mac running Vigil, the Away Alerts webhook, and the shared Black Label REST API, MCP server and SDKs for 1,600+ other apps.

blvigil.com agent API and MCP

Public, no key, rate limited per client (stay under one request a second). Spec: /openapi.json · registration statement: /auth.md · server card: /.well-known/mcp/server-card.json.

MethodPathWhat it does
POST/mcpMCP (Streamable HTTP, JSON-RPC 2.0). Tools: site_info, search_pages, read_page, list_products, create_checkout, get_checkout
GET/agent/site.jsonWhat Vigil is, with links to every discovery document
GET/agent/searchFind pages by words in their path
GET/agent/readRead one blvigil.com page as Markdown
GET/agent/commerce/productsPlans with Stripe-verified prices and availability
POST/agent/commerce/ucp/checkout-sessionsStart a checkout; returns a continue_url where the buyer pays on Stripe
curl
curl https://blvigil.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Claude Code
claude mcp add --transport http vigil https://blvigil.com/mcp

No tool charges anything: create_checkout only returns a link to the Stripe-hosted checkout page.

Local engine on your Mac

The Vigil app starts its sensing engine at http://127.0.0.1:8799 (override with VIGIL_ENGINE_PORT). It listens on your Mac only, needs no key, and refuses requests that carry an Origin or Referer header or a non-local Host, so call it from scripts and shortcuts, not from web pages.

MethodPathReturns
GET/healthok, source, model, fleet, rate_hz, predict readiness
GET/frameThe latest sensing frame: present, motion, live, source, csi_connected, range_peak_m, pose_ready, breathing and heart-rate estimates with their signal strength
GET/anomalystatus: learning_baseline, nominal or anomaly, with detail and nights_observed
GET/fallactive, state, the current alert, seconds since the last motion and breath
GET/baselineThe learned routine model summary
curl
curl -s http://127.0.0.1:8799/frame
Python
import json, urllib.request

def frame():
    with urllib.request.urlopen("http://127.0.0.1:8799/frame", timeout=2) as r:
        return json.load(r)

f = frame()
print("someone home" if f["present"] else "empty", "· motion", f["motion"])

Presence, breathing, heart-rate and fall readings are best-effort estimates. They can be delayed, missed or wrong and must not be used for medical, emergency or life-safety decisions. Read the health data notice.

Sensor hub · early access

With Vigil sensor nodes (early access), the hub answers on 127.0.0.1:8790 (VIGIL_SENTINEL_PORT): GET /health, /nodes and /alerts?hours=24. Callers on your Mac are trusted; any other caller must send X-Homefront-Token, and the hub refuses remote calls when no token is set.

Away Alerts webhook

In Vigil, set one HTTPS address for Away Alerts. Each alert is a POST with a JSON body and ntfy-style headers, so ntfy shows a titled, high-priority alert and Make, Zapier, n8n, Shortcuts or your own server can read the JSON. A send counts as delivered only on a 2xx reply.

HTTP
POST https://your-endpoint.example/vigil
Content-Type: application/json
Title: Vigil alert
Priority: high
Tags: warning

{"message": "Motion in the living room while you're away", "source": "Vigil", "title": "Vigil alert"}

Black Label platform: REST API, MCP and SDKs

The same account that connects your other apps gives you one API key for all of them. Create and revoke keys at Black Label developers ↗. Keys act as your account; keep them secret.

MCP: every connected app in any AI chat

Remote MCP server at https://tryacee.com/mcp with six tools: search_apps, connect_app, list_connections, find_tools, get_tool, run_tool. In Claude or ChatGPT, add a custom connector with the URL form https://tryacee.com/mcp/k/<key>; it carries your key, so treat it like a password.

Claude Code
claude mcp add --transport http ace https://tryacee.com/mcp --header "Authorization: Bearer ace_sk_YOUR_KEY"
Cursor · ~/.cursor/mcp.json
{
  "mcpServers": {
    "ace": {
      "url": "https://tryacee.com/mcp",
      "headers": { "Authorization": "Bearer ace_sk_YOUR_KEY" }
    }
  }
}
VS Code · .vscode/mcp.json
{
  "servers": {
    "ace": {
      "type": "http",
      "url": "https://tryacee.com/mcp",
      "headers": { "Authorization": "Bearer ace_sk_YOUR_KEY" }
    }
  }
}

SDKs

No dependencies. JavaScript runs in Node 18+, Deno, Bun, Workers and browsers; Python uses only the standard library. Downloads: JavaScript ↗ · Python ↗.

npm
npm install https://tryacee.com/sdk/tryacee-sdk-1.0.0.tgz
JavaScript
import { Ace } from "@tryacee/sdk";
const ace = new Ace({ apiKey: process.env.ACE_API_KEY });

const { url } = await ace.apps.connect("slack");          // send the user here once
const { tools } = await ace.tools.find("post a message in #home on Slack");
await ace.tools.run("SLACK_SEND_MESSAGE", { channel: "#home", markdown_text: "Front door opened" });
pip
pip install https://tryacee.com/sdk/tryacee-1.0.0-py3-none-any.whl
Python
from tryacee import Ace
ace = Ace()  # reads ACE_API_KEY
found = ace.tools.find("add an event to Google Calendar")
print(found)

REST API

Base https://tryacee.com/api/v1 · Authorization: Bearer ace_sk_… · JSON in and out · 120 requests a minute per key · full spec: OpenAPI ↗.

MethodPathWhat it does
GET/catalogPublic app catalog, no key
GET/apps?search=Search apps with your connection status
POST/apps/{app}/connectSign-in link that connects the app
GET/connectionsYour connected apps
POST/tools/findFind tools for a task in plain words
POST/tools/{tool}/runRun a tool in a connected app
POST/custom-connectorsAdd any company’s MCP server or REST API
POST/triggersGet a signed webhook when an event happens in a connected app
GET/runsYour 25 latest runs
curl
curl https://tryacee.com/api/v1/apps?search=slack \
  -H "Authorization: Bearer ace_sk_YOUR_KEY"