The MCP server
How AI agents reach Evercam — the hosted endpoint, its tools, and what it will not do.
Everything in this portal is reachable over plain HTTP. The Model Context Protocol server is the same platform packaged for AI agents: instead of an OpenAPI document a model reads, it exposes named tools a model can call, with the argument schemas and the domain guidance needed to choose between them.
It is a client of the APIs documented here — Dash, AI and Labs — not a replacement for them. Write your own application against the HTTP APIs; point an agent at MCP.
The hosted endpoint
https://mcp2.evercam.io/mcpThat is a Streamable HTTP MCP endpoint: a single POST route carrying
JSON-RPC, with responses streamed back as server-sent events.
| MCP endpoint | POST https://mcp2.evercam.io/mcp |
| Protocol version | 2025-06-18 (negotiates 2024-11-05 for older clients) |
| Server identity | evercam-mcp, version 0.1.0 |
| Sessions | None — served stateless, no Mcp-Session-Id is issued |
| Authorization server | https://mcp2.evercam.io/ — metadata at /.well-known/oauth-authorization-server |
| Health probe | GET https://mcp2.evercam.io/health → {"status":"ok","version":"0.1.0"} |
| Snapshot proxy | GET https://mcp2.evercam.io/snapshot/{exid} |
Every POST stands alone. The deployment is stateless: it issues no
Mcp-Session-Id, so there is no session to establish, resume or replay. A
client may initialize and then call tools on entirely separate connections,
and a single curl is a complete interaction. Nothing needs sticky sessions in
front of it. The one thing statelessness costs — server-initiated streams — is
a feature this server does not use.
What the server exposes
42 read tools, plus three resources that tell an agent how to use them.
Ahead of all of them sits an instructions preamble, returned in the
initialize handshake and read by the agent before its first call. It covers
the conventions below — exids, metadata versus images, relative snapshot paths,
null on partial failure, the smart-search gate — so a client generally orients
itself without being told any of this. Everything in this page is what you
need in order to predict what the agent will do.
| Domain | Tools |
|---|---|
| Cameras | list-cameras, get-camera, get-camera-status, list-cameras-with-latest-snapshot, list-cameras-with-presence |
| Snapshots | get-snapshot-image, get-live-snapshot-url, get-camera-recording-range, find-nearest-snapshot-time, get-latest-snapshot-metadata, get-oldest-snapshot-metadata, list-available-days, list-available-hours |
| Media | list-snapshots-in-range, list-media-hub-items |
| Projects | list-projects, list-projects-with-camera-count, list-project-cameras, get-project-overview, list-project-members, and — 403 over OAuth — list-project-users, list-project-roles |
| Progress photos | list-progress-photos, get-progress-photo |
| ANPR and gate reports | list-anpr-events, get-anpr-counts, list-gate-report-events, list-gate-report-processed-days, list-gate-report-verified-days, get-project-security-summary, list-rois |
| PPE safety | list-ppe-events, get-ppe-event-counts |
| Weather | get-current-weather, get-weather-history |
| Smart search | check-smart-search-availability, list-smart-search-queries, get-smart-search-query, smart-search-detections |
| 360 walkthroughs | list-360-assets, list-360-floors, list-360-walk-markers |
Resources
Readable documents an agent can pull in for context:
| URI | Contents |
|---|---|
evercam://glossary | Domain vocabulary — project, exid, snapshot, ROI, gate report, progress photo, 360 walkthrough |
evercam://tool-catalog | Tools grouped by the question they answer, with the distinctions between similar ones |
evercam://detection-labels | The 32 valid smart-search labels — 27 for fixed cameras, 5 for 360 |
Connect a client
Each client below takes the endpoint once and then runs the OAuth flow itself. None of them needs a header, a client ID or a callback port — the server registers the client automatically, and you sign in with your own Evercam account. Sign-in is per user and per client: approving in Claude Code does not sign you in to Cursor.
Claude Code
claude mcp add --transport http evercam https://mcp2.evercam.io/mcp --scope userThen, inside Claude Code, run /mcp and select evercam → Authenticate. A
browser opens, you sign in to Evercam and approve.
--scope user makes the server available in every project — usually what you
want:
| Scope | Where it applies |
|---|---|
user | Every project on this machine |
project | Shared with the repo through a committed .mcp.json |
local | This project, you only — the default if you omit the flag |
| Check | claude mcp list |
| Remove | claude mcp remove evercam --scope user |
Codex
codex mcp add evercam --url https://mcp2.evercam.io/mcp
codex mcp login evercamcodex mcp login runs the OAuth flow and opens a browser. The --url flag is
what tells Codex this is a streamable-HTTP server rather than a local command.
That writes the following to ~/.codex/config.toml, which you can also
hand-edit:
[mcp_servers.evercam]
url = "https://mcp2.evercam.io/mcp"| Check | codex mcp list — or codex mcp get evercam |
| Sign out | codex mcp logout evercam |
| Remove | codex mcp remove evercam |
Do not mix OAuth with a bearer token
--bearer-token-env-var points Codex at a fixed credential instead.
OAuth and a static bearer are alternatives, not companions: set the token and
Codex sends it instead of running the sign-in flow.
Gemini CLI
gemini mcp add --transport http evercam https://mcp2.evercam.io/mcp --scope userThen, inside the CLI, run /mcp auth. Two things differ from the other CLIs and
both catch people out:
- The default scope is
project, not user. Omit--scope userand the server is configured for the current directory only. - Authentication is not automatic. Gemini CLI discovers that the server
wants OAuth but waits for you to run
/mcp authbefore starting the flow. Until you do, the server appears configured but every call fails.
| Check | gemini mcp list |
| Remove | gemini mcp remove evercam |
If the server shows as Disabled rather than disconnected, enable it with
gemini mcp enable evercam — enablement is tracked separately from
configuration.
Cursor
Add the server to ~/.cursor/mcp.json for every workspace, or .cursor/mcp.json
inside a project to share it with the repo:
{
"mcpServers": {
"evercam": {
"url": "https://mcp2.evercam.io/mcp"
}
}
}A url with no command is what marks it as a remote server. Leave out
headers entirely — Cursor negotiates the token itself.
Then open Cursor's settings, find evercam in the MCP list, and use the sign-in control beside it (Needs login, or Connect, depending on version). The browser opens, you approve, and the entry turns green with its tool count. Until you sign in the server is listed but unusable.
VS Code
VS Code's agent mode reads .vscode/mcp.json in a workspace, or your user-level
configuration via MCP: Open User Configuration in the command palette. Note
the key is servers, not mcpServers:
{
"servers": {
"evercam": {
"type": "http",
"url": "https://mcp2.evercam.io/mcp"
}
}
}The equivalent one-liner, which writes the same entry for you:
code --add-mcp '{"name":"evercam","type":"http","url":"https://mcp2.evercam.io/mcp"}'Run MCP: List Servers → evercam → Start Server. VS Code registers itself with the server, opens the browser for sign-in, and asks you to confirm the account it will use. Its output channel for the server is where any failure in that handshake is reported.
Claude (web and desktop)
Added once by an org Owner, then enabled individually by everyone else.
Owner, once: Settings → Connectors → Add custom connector.
| Field | Choose |
|---|---|
| URL | https://mcp2.evercam.io/mcp |
| Authentication | Always required — auto-detected |
| OAuth client | Use Anthropic's hosted client metadata — recommended, auto-detected |
| Individual sign-in | On |
| Additional request headers | leave empty |
Leave the client ID and secret blank. The server registers Claude automatically, and there is no credential to enter here.
Everyone else, once each: Settings → Connectors → find Evercam → Connect, sign in, approve.
Claude Desktop uses the same Connectors screen and picks up the org connector automatically.
ChatGPT
ChatGPT requires Developer mode, and on Business and Enterprise plans this is a two-person job.
A workspace admin enables developer mode
Workspace Settings → Permissions & Roles → turn on developer mode / custom MCP connectors. Admins cannot enable this for one member individually; on Enterprise and Edu, RBAC can scope who gets it.
You turn it on for yourself
Settings → Security and login → Developer mode.
Add the server
Open ChatGPT Plugins, press +, and provide:
| Field | Value |
|---|---|
| Name | Evercam |
| Description | Read Evercam cameras, projects and site intelligence |
| Server URL | https://mcp2.evercam.io/mcp — include the /mcp path |
ChatGPT discovers the tools and runs the OAuth flow, which is where you sign in to Evercam.
An admin publishes it
New connectors land under Drafts. Only admins and owners can publish, from Workspace Settings → Apps → Drafts → Publish. Published connectors appear in the approved list marked custom.
On Business plans, a published app cannot be edited
Changing its name, description or tools means recreating and republishing it. Worth getting the details right the first time.
Availability and the exact labels vary by plan and workspace policy — if Developer mode is not in your settings, your workspace has not enabled it.
What to ask first
Once a client is connected, these exercise progressively more of the surface. Each is answerable end to end by the agent, without you naming an exid up front.
| Ask the agent | What it exercises |
|---|---|
| List my Evercam projects and cameras. | list-projects → list-project-cameras — the opening move of nearly every session |
| Which cameras have footage from today? | list-available-days, list-cameras-with-latest-snapshot |
| What does the site at <project> look like right now? | get-project-overview, get-snapshot-image — or the site-status-report prompt in one step |
| How many vehicles entered the site last month? | get-anpr-counts — one call, rather than paging list-anpr-events to tally |
| Were there any PPE violations last week? | get-ppe-event-counts, then list-ppe-events with violationsOnly |
| Find an excavator in last week's footage and show me a frame. | check-smart-search-availability → smart-search-detections → get-snapshot-image, or the find-object-in-footage prompt |
If an agent stalls on any of these, point it at evercam://tool-catalog — the
resource exists precisely to answer "which tool answers this question".
Behaviour to account for
Nearly every tool needs an exid. An exid is opaque and cannot be derived
from a display name, so a session almost always opens with list-projects then
list-project-cameras. See
Projects, cameras and exids.
Only one tool returns an image. get-snapshot-image returns actual bytes;
every other snapshot tool returns metadata. It rejects images over maxBytes
(default 2,000,000) rather than truncating them — raise the limit or pass
mode="url".
get-live-snapshot-url returns a relative path. So do the liveUrl and
snapshotUrl fields elsewhere: they point at this server's own
/snapshot/{exid} route, not at an absolute Evercam URL.
Naive timestamps are the camera's local time. Every date argument is
ISO 8601; a bare date means midnight. Without a Z or an explicit offset it is
interpreted in the camera's own timezone, not yours.
null means the lookup failed. Tools that gather from several backends
report a failed part as null rather than failing the whole call. null is
not zero. list-gate-report-events goes further and degrades to another source
— check its source field for anpr-fallback (you got raw plate detections)
or empty-fallback (nothing could be retrieved).
Use the count tools for "how many". get-anpr-counts and
get-ppe-event-counts answer in one call; paging through the corresponding
list tool to tally is the wrong approach.
Smart search is feature-gated. It needs the project's smart_search flag
and cameras with object_detection. Call check-smart-search-availability
first so an empty result can be told apart from a disabled feature, and check
list-smart-search-queries for a saved query before composing one by hand.
Ready to connect a client? Jump to Connect a client for the per-client sign-in steps.