event-hog-mcp
The server runs entirely on Cloudflare: a single Worker hosts the MCP endpoint and media routes, Cloudflare Artifacts stores one git repo per event (plus the event-hog-kit repo of skills and templates), D1 (SQLite, bound as CRM) holds the structured model of people, organizations, event series, observations, interactions and locations, and an R2 bucket (event-hog-media) stores images and PDFs served at /media/. Includes deployment setup via wrangler (D1 migrations, R2 bucket, secrets).
The client CRM today: contacts discovered during an event are queued as proposals (crm_queue), marked synced once created, and can be exported as a HubSpot CSV. The server itself never calls HubSpot; Claude creates the approved contacts through the person's own HubSpot connector, so the CRM holds a projection of the event's people data.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@event-hog-mcplog Jane Doe from Acme, met at the booth, interested in solar"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
event-hog-mcp
A remote MCP server that gives a team working a conference one shared workspace in Claude (Desktop, web, mobile) or Codex: prep before, contacts, notes and slides during, follow-ups and CRM sync after. Every write is a git commit by the person who made it.
It runs as one Cloudflare Worker. First used for real at the 7x24 Exchange Fall Conference 2026 (San Antonio, Oct 25–28), with Edviro Energy.
How it works
Three layers, each with one job (the full reasoning is in
context-v/decisions/2026-10-25_Three-Layers-and-an-Agnostic-CRM-for-Event-Hog.md):
Layer | What | Job |
Cloudflare Artifacts | One git repo per event ( | The shared, human-readable record: prep, contacts, notes, slides, drafts. Git history gives attribution and undo |
D1 | SQLite, bound as | A structured model of people, organizations, event series and instances, observations, interactions, affiliations and nested locations. Rebuildable from the files |
The client's CRM | HubSpot today | A projection: contacts are proposed, approved, then created through the person's own HubSpot connector |
Plus an R2 bucket, event-hog-media, for images and PDFs, served at
/media/<key>. Repos hold text and the image's URL, never image bytes.
On every tool call the Worker clones the event repo into memory (isomorphic-git), changes files, commits as the caller, and pushes. If a teammate's push lands first, it retries from a fresh clone (up to 5 times). Writes add files or append to them, so a retry never clobbers anything.
Routes
Path | What |
| The MCP endpoint (JSON-RPC over HTTP). The key identifies the person |
| Public files from the bucket. HTML is served with a CSP sandbox: no scripts, no forms |
| A person's camera page for slide photos. The token is derived from their key |
| A one-time, 15-minute upload link minted by |
The kit
kit/ is what goes into the event-hog-kit Artifacts repo: the
skills the server serves (list_skills, get_skill), the template a new
event starts from (new_event), and per-deployment settings
(config/skills.json, served by get_config). Skills are read from the kit
first, then from the CRM deployment's brain repo (BRAIN_NAMESPACE/SKILLS_REPO).
Related MCP server: agent-bridge
Tools
Workspace: event_brief (start here), list_events, new_event,
whoami, list_files, read_file, search, recent_activity,
append_to_file, add_note.
Contacts and CRM: log_contact (appends to an existing contact matched by
email, then name and company), contacts_csv, query_crm, relate_orgs,
define_location, link_location, who_is_in, crm_queue,
mark_crm_synced, export_hubspot_csv.
Skills: list_skills, get_skill, get_config, set_my_research_tools,
save_speaker_profile.
Slides and files: slide_capture_link, upload_link, slides,
view_slide, save_slide_notes, add_field_note.
Brand: get_design_system, extract_brand, save_design_system,
save_recreated_slide.
Starters: save_flash_cards, flash_cards, save_draft,
add_to_draft, drafts.
What the server guarantees, and what it only asks Claude to do
This is the line to check in review. Some behavior is enforced in code;
some is an instruction to the model (the server's instructions and the
skills), which a model can fail to follow.
Enforced in code:
Every write is a commit authored as the caller (
PEOPLEmaps key → name and email).Contact and note writes add or append; existing contact fields are filled when blank, never overwritten. Slide notes that already exist get "another take", not a replacement.
mark_crm_syncedrecords whatever HubSpot ID it's given. It does not check HubSpot.Recreated slides are rejected if they contain
<script>or lack a credit line. The credit check is loose: the words "source", "adapted from" or "via" anywhere in the text pass it. All HTML under/media/is served sandboxed.Upload links: signed (HMAC keyed by the person's connector key), expire in 15 minutes, single use, and the file's first bytes must match its type.
Asked of the model, not enforced:
Search before logging a contact; never invent fields.
Propose CRM records and create them only after the person approves. The server never calls HubSpot; Claude does, through the person's own HubSpot connector.
Nothing is ever posted publicly: drafts only.
Discretion rules for posts (hallway conversations stay private, and so on).
Your data
On your own Cloudflare account, your data never reaches us. On the deployment we run, DATA-POLICY.md applies: stored so your team can use it, never looked at or used commercially.
Security model, plainly
The connector URL is the credential. Anyone with
…/mcp/<key>acts as that person. There is no sign-in yet. Treat the URL like a password./media/is public. Anyone with a file's URL can open it. Keys the server writes include random parts, so its URLs can't be guessed, but don't put anything there you wouldn't share by link.config/skills.jsonis served to every connector user. Settings only, never credentials.
Known gaps (for 0.1.0)
npx wrangler devfails locally:src/index.tsexports plain constants (DIR,CONTACTS_CSV), which the local runtime treats as handlers. Production accepts them."CRM-agnostic" is half true: the database model is ours, but the sync step (
hubspot_status,crm_queue,export_hubspot_csv) only knows HubSpot.Every call clones the whole event repo. Fine for one event's worth of text; slower as repos grow.
The used-upload-link marker is check-then-write, not atomic.
Not yet verified end to end: a slide sent with
upload_linkfrom Claude's sandbox, which also needs the Claude org admin to allow this Worker's host for code execution.
Deploy your own
You need a Cloudflare account with Artifacts, D1 and R2.
npm install
npx wrangler d1 create agnostic-crm # put its id in wrangler.jsonc
npx wrangler r2 bucket create event-hog-media
npx wrangler d1 migrations apply agnostic-crm --remoteFill in the
<...>values inwrangler.jsonc, includingPUBLIC_URL.Create the
event-hog-kitrepo in your Artifacts namespace and pushkit/into it. Copykit/config/skills.example.jsontoconfig/skills.jsonand fill it in.Set the people:
npx wrangler secret put PEOPLE, a JSON map of connector key →{ "name", "email", "emails"?, "crm_email"? }. Generate each key withopenssl rand -hex 24.npx wrangler deploy.Each person adds
https://<your worker>/mcp/<their key>in Claude as a custom connector. Then ask Claude to start a new event (new_event).
seeds/ has the 7x24 Exchange Fall 2026 instance as an example seed.
Developing
npm run check # tsc --noEmitCommit messages follow the Lossless git conventions.
License
Apache-2.0. See LICENSE. Keep NOTICE in any copy or fork: it credits The Lossless Group.
This server cannot be deployed
Maintenance
Related MCP Connectors
Shared workspace where Claude, ChatGPT, Codex and Grok share files, tasks, decisions and handoffs.
The team layer for AI coding agents: shared contracts, collision alerts, E2EE sessions.
- SeturosOAuthcom.seturos
Shared work memory for Claude Code, Codex, Cursor and chat, scoped to each repository.
Shared memory for a team in Claude Code: what one person records, everyone has.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables multiple isolated Claude sessions to read markdown knowledge bases versioned in git and deposit proposals, while only a manager role integrates changes.61Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables coordinating Claude Code and Codex across separate Git worktrees with shared issue ownership, file reservations, messages, and explicit handoffs.95 PyPI3MIT
- AlicenseAqualityBmaintenanceEnables teams to share structured, git-synced context among AI coding agents working on the same repository, including living plans, task declarations, handoff briefs, file-provenance history, and conflict detection.125 npm3MIT
- AlicenseNot gradedqualityBmaintenanceEnables separate Claude Code sessions across a team to see teammates' live presence, warn before editing a file someone else is editing, route shared-contract changes to the developers whose code depends on them, and produce structured handoffs when a session ends.304 npm1MIT