Docs
Momentra Events — MCP Server
Momentra finds and organizes local public events — concerts, markets, talks, classes, meetings and more — and exposes them to AI assistants as an MCP server. Point it at the venues and organizations you care about, and your assistant can search their published calendars and turn the results into plans.
This page documents the MCP server: how to connect it and the tools it exposes.
Server details
| Server name | momentra-events |
| Endpoint | https://mcp.momentra.org/mcp |
| Protocol | MCP over HTTPS (Streamable HTTP / SSE), JSON-RPC 2.0 |
| Auth | OAuth 2.1 + PKCE, with Client ID Metadata Documents (CIMD) |
| Compatible hosts | ChatGPT connectors, Claude connectors, any MCP-compatible client |
Connecting
Momentra uses the standard MCP OAuth 2.1 authorization flow — no API keys to copy, no separate account signup.
- Add the connector using the endpoint
https://mcp.momentra.org/mcp(or click the Claude / ChatGPT app link). - The host runs the OAuth 2.1 + PKCE flow. Momentra advertises CIMD (
client_id_metadata_document_supported), a stable redirect, andauthorization_response_iss_parameter_supported, so ChatGPT and Claude connect without manual client registration. - The host stores the issued token and reuses it across sessions and refreshes.
Discovery metadata is served from the endpoint’s origin (RFC 8414 authorization-server metadata and RFC 9728 protected-resource metadata), so hosts can auto-configure.
Typical flow
index_org— add an organization’s calendar. Returns ajobId(orstatus: "ready"immediately if it’s already indexed).org_status— poll thejobIduntilstatus: "ready".search/search_business_events— find events.fetch— pull the full document for a specific result.
get_profile and search_businesses are available at any point.
Tools
The server exposes seven tools. Each result is returned as MCP tool-result content (a JSON text block; search/fetch follow OpenAI’s connector result shape). Tools annotated read-only never change state; the two write/billable tools are annotated so hosts can prompt before invoking.
index_org
Add an organization’s calendar so its events become available to your account.
- Input:
website(string, required — org website or domain),startDate(string, optional,YYYY-MM-DD, defaults to today),endDate(string, optional,YYYY-MM-DD, defaults to +90 days). - Returns: either
status: "indexing"with ajobId(pollorg_status), orstatus: "ready"when a current index already exists. A site that can’t be reached returns afound: falsenon-starter result (not an error). - Annotations:
title: "Add a Venue’s Calendar", write / state-changing.
org_status
Poll an index job started by index_org.
- Input:
jobId(string, required — fromindex_org). - Returns:
status∈pending | indexing | ready | failed | expired, withprogress(0–100) andetaSecondswhile running, andorgId+eventCountwhen ready. - Annotations:
title: "Check Calendar Progress", read-only.
search
Search events across the organizations available to your account. Follows the OpenAI search result contract.
- Input:
query(string) — free text over organizations and events. - Returns:
{ results: [{ id, title, url, ... }] }. Resultids are opaque:org:<orgId>orevent:<orgId>:<eventId>, for use withfetch. - Annotations:
title: "Search Events", read-only.
fetch
Return the full document for an id returned by search. Follows the OpenAI fetch result contract.
- Input:
id(string) — anorg:…orevent:…id fromsearch. - Returns:
{ id, title, text, url, metadata }. For an org id,metadata.organizationcarries the full organization record; for an event id,textis the full event JSON. - Annotations:
title: "Open an Event or Venue", billable.
search_businesses
Find organizations available to your account by name or domain.
- Input:
query(string, required) — name or domain. - Returns:
{ count, query, businesses: [ <organization record> ] }, each with an upcomingeventCount. - Annotations:
title: "Find Venues and Organizations", read-only.
search_business_events
List one organization’s upcoming events.
- Input:
orgId(string, optional —org:prefix tolerated) ordomain(string, optional). One is required. - Returns:
{ organization: <record>, eventCount, events: [ <event> ] }. - Annotations:
title: "List a Venue’s Events", read-only.
get_profile
Return the profile for the connected credentials — a stable, opaque account identifier (used by multi-account hosts to label connections).
- Input: none.
- Returns:
{ id, email?, nickname? }in bothstructuredContentand a JSON text block. Theidis stable across token refresh and reconnection and encodes no personal data. - Annotations:
title: "View Connected Account", read-only.
Organization shape
Wherever a response includes an organization (search_businesses, search_business_events, fetch of an org: id, and each matched org in search), it is returned as a flat record. Fields appear only when available:
{
"id": "org:9bdc8aa1…",
"orgId": "9bdc8aa1…",
"domain": "montshire.org",
"url": "https://montshire.org",
"name": "Montshire Museum of Science",
"address": "1 Montshire Road, Norwich, VT 05055",
"phone": "+1 802-649-2200",
"email": "montshire@montshire.org",
"socials": [
{ "type": "instagram", "url": "https://instagram.com/montshire" },
{ "type": "facebook", "url": "https://facebook.com/montshiremuseum" }
],
"eventCount": 12,
"lastIndexedAt": "2026-09-24T00:00:00.000Z"
}id/orgId/domain/url— stable identity.name,address,phone,email,socials[]({type, url}),eventCount— included when available.addressis a single line; the organization’s own site is preferred, with a more complete third-party address used only as a fallback.
Event shape
Events returned by fetch (an event: id) and search_business_events are normalized to a consistent shape. Fields appear only when available:
{
"title": "Shrubland Restoration Volunteer Day",
"description": "A morning of habitat work with Audubon Vermont staff…",
"startDate": "2026-09-26T09:00:00-04:00",
"endDate": "2026-09-26T13:00:00-04:00",
"venue": { "name": "Rokeby Museum", "address": "4334 Route 7, Ferrisburgh, VT" },
"address": "4334 Route 7, Ferrisburgh, VT",
"isAccessibleForFree": true,
"cost": "Free",
"offers": [{ "name": "General", "price": 0, "priceCurrency": "USD", "availability": "InStock" }],
"categories": ["Volunteer", "Nature"],
"website": "https://rokeby.org/event/shrubland-restoration-volunteer-day/",
"ticket_url": "https://www.mobilize.us/audubon-vt/event/1022135/",
"more_info_website": null
}title,description.startDate,endDate— ISO 8601 with timezone offset.venue(name,address) and a top-leveladdress.- Pricing:
isAccessibleForFree, a human-readablecost, and structuredoffers[]when a price is published. - Three link fields, each with a distinct role:
website— the event’s own detail page on the organization’s site.ticket_url— an external ticketing / registration / RSVP page, when linked.more_info_website— an external organizer / venue info page, when linked.
A link field is only populated with a real link of the correct type; generic pages (home, newsletter, collections) and non-link text are never placed in these fields.
Access and availability
- Your assistant works with the organizations available to your account. Adding an organization with
index_orgmakes it and its events available to you. - Coverage of any organization depends on what it publishes on its own website; Momentra reads the published calendar and does not follow external ticketing or aggregator sites beyond recording their links.
- Free usage has a daily limit that resets each day. If you reach it, your assistant is told; come back the next day or add credits to continue.
Support
Questions about connecting or using the Momentra Events MCP server: momentra.org.
