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.
| Method | Path | What it does |
|---|---|---|
| POST | /mcp | MCP (Streamable HTTP, JSON-RPC 2.0). Tools: site_info, search_pages, read_page, list_products, create_checkout, get_checkout |
| GET | /agent/site.json | What Vigil is, with links to every discovery document |
| GET | /agent/search | Find pages by words in their path |
| GET | /agent/read | Read one blvigil.com page as Markdown |
| GET | /agent/commerce/products | Plans with Stripe-verified prices and availability |
| POST | /agent/commerce/ucp/checkout-sessions | Start a checkout; returns a continue_url where the buyer pays on Stripe |
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 mcp add --transport http vigil https://blvigil.com/mcpNo 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.
| Method | Path | Returns |
|---|---|---|
| GET | /health | ok, source, model, fleet, rate_hz, predict readiness |
| GET | /frame | The latest sensing frame: present, motion, live, source, csi_connected, range_peak_m, pose_ready, breathing and heart-rate estimates with their signal strength |
| GET | /anomaly | status: learning_baseline, nominal or anomaly, with detail and nights_observed |
| GET | /fall | active, state, the current alert, seconds since the last motion and breath |
| GET | /baseline | The learned routine model summary |
curl -s http://127.0.0.1:8799/frameimport 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.
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 mcp add --transport http ace https://tryacee.com/mcp --header "Authorization: Bearer ace_sk_YOUR_KEY"{
"mcpServers": {
"ace": {
"url": "https://tryacee.com/mcp",
"headers": { "Authorization": "Bearer ace_sk_YOUR_KEY" }
}
}
}{
"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 install https://tryacee.com/sdk/tryacee-sdk-1.0.0.tgzimport { 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 install https://tryacee.com/sdk/tryacee-1.0.0-py3-none-any.whlfrom 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 ↗.
| Method | Path | What it does |
|---|---|---|
| GET | /catalog | Public app catalog, no key |
| GET | /apps?search= | Search apps with your connection status |
| POST | /apps/{app}/connect | Sign-in link that connects the app |
| GET | /connections | Your connected apps |
| POST | /tools/find | Find tools for a task in plain words |
| POST | /tools/{tool}/run | Run a tool in a connected app |
| POST | /custom-connectors | Add any company’s MCP server or REST API |
| POST | /triggers | Get a signed webhook when an event happens in a connected app |
| GET | /runs | Your 25 latest runs |
curl https://tryacee.com/api/v1/apps?search=slack \
-H "Authorization: Bearer ace_sk_YOUR_KEY"