CompanyCam MCP server for AI agents

Live

BEARER TOKEN

JOBSITE PHOTOS

Project Management

CompanyCam gives your agent jobsite documentation: find and tag project photos, manage projects, customers, and checklists, build pages and documents, and create Sales Suite proposals and invoices.

  • Per-user credentials: each call uses the actual user's access token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
CompanyCam
agent · Acme Q3
Run
Show photos from the Maple Street roof project taken this week.
S
companycam_project_photos_list
122ms
Jobsite agent
Crews added 37 photos to Maple Street Roof this week. 12 are tagged tear-off and 8 are tagged final.
Sources: CompanyCam, 1 project, 37 photos
companycam
37 photos
18:29
Message Claude...

Tools your jobsite agent reaches for on CompanyCam, scoped per user.

CALL ANY TOOL
119 tools for jobsite documentation in CompanyCam: projects, photos, videos, tags, checklists, tasks, pages, documents, customers, boards, time entries, and Sales Suite proposals and invoices.
companycam_board_get
Get board
Get a CompanyCam project board with its phases. Returns the board's id, name, position and phases. Use companycam_boards_list to find the board ID.
Parameters
Name
Type
Required
Description
board_id
string
Required
ID of the board. Get it from companycam_boards_list. Example: 12345678
companycam_board_phase_projects_list
List board phase projects
companycam_board_project_move
Move board project
companycam_current_user_get
Get current user
companycam_customer_contact_create
Create customer contact
companycam_customer_contact_delete
Delete customer contact
companycam_customer_contact_update
Update customer contact
companycam_customer_contacts_list
List customer contacts
companycam_group_get
Get group
companycam_invoice_update
Update invoice
companycam_invoices_list
List invoices
companycam_photo_description_set
Set photo description
companycam_photo_tags_add
Add photo tags
companycam_price_book_item_get
Get price book item
companycam_price_book_items_list
List price book items
companycam_project_archive
Archive project
companycam_project_checklist_create
Create project checklist
companycam_project_checklist_fields_update
Update project checklist fields
companycam_project_custom_fields_list
List project custom fields
companycam_project_customer_remove
Remove project customer
companycam_project_delete
Delete project
companycam_project_document_folder_create
Create project document folder
companycam_project_get
Get project
companycam_project_pages_list
List project pages
companycam_project_photo_create
Create project photo
companycam_project_task_update
Update project task
companycam_project_unarchive
Project unarchive
companycam_projects_search
Search projects
companycam_proposal_line_items_list
List proposal line items
companycam_tag_get
Get tag

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// CompanyCam tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["companycam"], toolNames: [
    "companycam_projects_search",
    "companycam_project_photos_list",
    "companycam_photo_tags_add"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Tag this week's Maple Street photos as final inspection" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["companycam"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Tag this week's Maple Street photos as final inspection" }],
  tools,
});

// Execute the tool call with the user's vaulted CompanyCam access token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["companycam"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Tag this week's Maple Street photos as final inspection" }],
  tools,
});

// Tool call runs with the user's vaulted CompanyCam access token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["companycam"] }, pageSize: 100,
});

const agent = new Agent({
  name: "jobsite_agent",
  model: "gemini-2.5-pro",
  instruction: "CompanyCam tools scoped to this user",
  tools,
});

await agent.run("Tag this week's Maple Street photos as final inspection");
Try these prompts
Copy any prompt into your agent. Each maps directly to a CompanyCam tool. Click to copy, paste into your agent, done.
Projects
Copy the prompt
Copied
Create a project at 412 Maple Street for the customer Jane Doe.
Copy the prompt
Copied
Move the Maple Street project to the Install phase on our Jobs board.
Copy the prompt
Copied
Assign Liam to the Oak Avenue project.
Photos
Copy the prompt
Copied
Show photos from the Maple Street project taken this week.
Copy the prompt
Copied
Tag the latest 5 photos on Oak Avenue as final inspection.
Copy the prompt
Copied
Comment on this photo asking the crew to reshoot the flashing.
Office
Copy the prompt
Copied
Add the Final Walkthrough checklist to the Maple Street project.
Copy the prompt
Copied
Draft a proposal for the Oak Avenue project.
Copy the prompt
Copied
Total the time each user tracked on Maple Street this week.
SEE HOW AUTH WORKS
Each user connects their own CompanyCam access token once, and Scalekit sends it with every call. Access tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
CompanyCam
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
CompanyCam
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
CompanyCam
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
CompanyCam
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other project management and files connectors.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
GTM and RevOps Teams
Deal room sync
Pulls opportunity context from Salesforce, captures key decisions from Slack, and syncs a running summary to the deal room doc in Google Drive, but only when the deal actually changed.
Test other agents
See the same per-user auth pattern across other project management and files connectors.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
GTM
Deal room sync agent
Pull opportunity context from Salesforce, capture decisions from Slack, and keep the Google Drive deal room doc current.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared CompanyCam access token looks fine in a demo. In production every photo comment and project change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
CompanyCam today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access CompanyCam as the user or through a shared token?
As the user. Each user connects their own CompanyCam access token once, and Scalekit sends it with every call. Comments, tags, and project changes the agent makes are attributed to that user in your audit trail, not a shared service account.
Where is the CompanyCam access token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new access token. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in CompanyCam?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the photo and project read tools without companycam_project_delete or companycam_photo_delete, which soft-delete projects and photos. Scalekit also enforces scope checks before every API call.
What happens when a user revokes CompanyCam access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Whose name appears on comments the agent posts?
The user who owns the access token. companycam_photo_comment_create and companycam_project_comment_create post as that user, and companycam_current_user_get returns who it is.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""companycam"": {
""url"": ""https://mcp.scalekit.com/companycam"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.companycam]
url = ""https://mcp.scalekit.com/companycam""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""companycam"": {
""url"": ""https://mcp.scalekit.com/companycam"",
""type"": ""http""
}
}
}