EvercamDevelopers

Search

Search guides, documentation and the API reference

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/mcp

That is a Streamable HTTP MCP endpoint: a single POST route carrying JSON-RPC, with responses streamed back as server-sent events.

MCP endpointPOST https://mcp2.evercam.io/mcp
Protocol version2025-06-18 (negotiates 2024-11-05 for older clients)
Server identityevercam-mcp, version 0.1.0
SessionsNone — served stateless, no Mcp-Session-Id is issued
Authorization serverhttps://mcp2.evercam.io/ — metadata at /.well-known/oauth-authorization-server
Health probeGET https://mcp2.evercam.io/health{"status":"ok","version":"0.1.0"}
Snapshot proxyGET 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.

DomainTools
Cameraslist-cameras, get-camera, get-camera-status, list-cameras-with-latest-snapshot, list-cameras-with-presence
Snapshotsget-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
Medialist-snapshots-in-range, list-media-hub-items
Projectslist-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 photoslist-progress-photos, get-progress-photo
ANPR and gate reportslist-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 safetylist-ppe-events, get-ppe-event-counts
Weatherget-current-weather, get-weather-history
Smart searchcheck-smart-search-availability, list-smart-search-queries, get-smart-search-query, smart-search-detections
360 walkthroughslist-360-assets, list-360-floors, list-360-walk-markers

Resources

Readable documents an agent can pull in for context:

URIContents
evercam://glossaryDomain vocabulary — project, exid, snapshot, ROI, gate report, progress photo, 360 walkthrough
evercam://tool-catalogTools grouped by the question they answer, with the distinctions between similar ones
evercam://detection-labelsThe 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

Terminal
claude mcp add --transport http evercam https://mcp2.evercam.io/mcp --scope user

Then, 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:

ScopeWhere it applies
userEvery project on this machine
projectShared with the repo through a committed .mcp.json
localThis project, you only — the default if you omit the flag
Checkclaude mcp list
Removeclaude mcp remove evercam --scope user

Codex

Terminal
codex mcp add evercam --url https://mcp2.evercam.io/mcp
codex mcp login evercam

codex 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:

~/.codex/config.toml
[mcp_servers.evercam]
url = "https://mcp2.evercam.io/mcp"
Checkcodex mcp list — or codex mcp get evercam
Sign outcodex mcp logout evercam
Removecodex 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

Terminal
gemini mcp add --transport http evercam https://mcp2.evercam.io/mcp --scope user

Then, 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 user and 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 auth before starting the flow. Until you do, the server appears configured but every call fails.
Checkgemini mcp list
Removegemini 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:

~/.cursor/mcp.json
{
  "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:

.vscode/mcp.json
{
  "servers": {
    "evercam": {
      "type": "http",
      "url": "https://mcp2.evercam.io/mcp"
    }
  }
}

The equivalent one-liner, which writes the same entry for you:

Terminal
code --add-mcp '{"name":"evercam","type":"http","url":"https://mcp2.evercam.io/mcp"}'

Run MCP: List ServersevercamStart 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 → ConnectorsAdd custom connector.

FieldChoose
URLhttps://mcp2.evercam.io/mcp
AuthenticationAlways required — auto-detected
OAuth clientUse Anthropic's hosted client metadata — recommended, auto-detected
Individual sign-inOn
Additional request headersleave 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 loginDeveloper mode.

Add the server

Open ChatGPT Plugins, press +, and provide:

FieldValue
NameEvercam
DescriptionRead Evercam cameras, projects and site intelligence
Server URLhttps://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 agentWhat it exercises
List my Evercam projects and cameras.list-projectslist-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-availabilitysmart-search-detectionsget-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.