Momentra

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 namemomentra-events
Endpointhttps://mcp.momentra.org/mcp
ProtocolMCP over HTTPS (Streamable HTTP / SSE), JSON-RPC 2.0
AuthOAuth 2.1 + PKCE, with Client ID Metadata Documents (CIMD)
Compatible hostsChatGPT 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.

  1. Add the connector using the endpoint https://mcp.momentra.org/mcp (or click the Claude / ChatGPT app link).
  2. The host runs the OAuth 2.1 + PKCE flow. Momentra advertises CIMD (client_id_metadata_document_supported), a stable redirect, and authorization_response_iss_parameter_supported, so ChatGPT and Claude connect without manual client registration.
  3. 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

  1. index_org — add an organization’s calendar. Returns a jobId (or status: "ready" immediately if it’s already indexed).
  2. org_status — poll the jobId until status: "ready".
  3. search / search_business_events — find events.
  4. 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 a jobId (poll org_status), or status: "ready" when a current index already exists. A site that can’t be reached returns a found: false non-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 — from index_org).
  • Returns: status ∈ pending | indexing | ready | failed | expired, with progress (0–100) and etaSeconds while running, and orgId + eventCount when 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, ... }] }. Result ids are opaque: org:<orgId> or event:<orgId>:<eventId>, for use with fetch.
  • 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) — an org:… or event:… id from search.
  • Returns: { id, title, text, url, metadata }. For an org id, metadata.organization carries the full organization record; for an event id, text is 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 upcoming eventCount.
  • Annotations: title: "Find Venues and Organizations", read-only.

search_business_events

List one organization’s upcoming events.

  • Input: orgId (string, optional — org: prefix tolerated) or domain (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 both structuredContent and a JSON text block. The id is 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.
  • address is 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-level address.
  • Pricing: isAccessibleForFree, a human-readable cost, and structured offers[] 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_org makes 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.