> ## Documentation Index
> Fetch the complete documentation index at: https://docs.momentra.org/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP JSON-RPC 2.0 endpoint (tools/list, tools/call)

> The single MCP transport endpoint, served at https://mcp.momentra.org/mcp (NOT on the REST origin). Send a JSON-RPC 2.0 request. Use `method: "tools/list"` to enumerate tools, or `method: "tools/call"` with `params.name` (one of the 24 tools) and `params.arguments` (the tool's request schema). The response is a JSON-RPC result whose `result.content[0].text` holds the tool's JSON payload (account-scoped tools also populate `result.structuredContent`). Batch-capable tools return `{ batch: true, count, items: [...] }` when given an array input.



## OpenAPI

````yaml /openapi.json post /mcp
openapi: 3.1.0
info:
  title: Momentra Events — REST + MCP API
  version: 1.0.0
  description: >-
    Momentra Events exposes local family-event data two ways in ONE document:


    1. A conventional HTTP REST API under `/api/v1/*`, fronted by the ZeroClick
    storefront at `https://agents.momentra.org/zcj/{session}`. PATH NOTE: every
    REST request MUST include the full `/api/v1` prefix exactly as shown;
    dropping it returns 403 'Missing Authentication Token'. The `/api/v1` prefix
    is owned by the PATHS, not the base URL. REST auth: a ZeroClick-signed
    request (zc-signature) with a registered agent credential, or
    `Authorization: Bearer <agent key>` on read routes. REST billing: free
    routes do an identity check only; paid routes check allowance and settle via
    a `zc-usage` response header on the 200.


    2. A Model Context Protocol (MCP) server at `POST /mcp` on
    `https://mcp.momentra.org` — a single JSON-RPC 2.0 endpoint over Streamable
    HTTP/SSE. It is NOT REST: every capability is an MCP `tools/call` with a
    `name` + `arguments`, and the 24 tools are enumerated by `tools/list`. MCP
    auth is OAuth 2.1 + PKCE (CIMD); some tools work anonymously (noauth).
    Per-tool auth + cost are noted in each `Tool_*` schema. The `/mcp` path
    carries a per-path `servers` override (mcp.momentra.org); the REST paths use
    the storefront server.


    The two surfaces bill the same underlying `momentra-events` service through
    different channels (ZeroClick per-request units vs. prepaid Momentra
    credits).
  contact:
    name: Momentra
    url: https://momentra.org
servers:
  - url: https://agents.momentra.org/zcj/{session}
    description: >-
      REST: ZeroClick storefront (session-scoped base path) — how agents CALL
      the /api/v1 paths.
    variables:
      session:
        default: SESSION
        description: ZeroClick session token segment issued by the storefront.
security: []
tags:
  - name: search
    description: 'REST: free, identity-scoped discovery over the global index.'
  - name: events
    description: 'REST: read event/organization data.'
  - name: indexing
    description: 'REST: index an organization and poll the job.'
  - name: mcp
    description: 'MCP: the JSON-RPC tools endpoint (tools/list, tools/call).'
  - name: index
    description: 'MCP: add organizations'' calendars and poll crawl jobs.'
  - name: discover
    description: 'MCP: search and read events/organizations already in your scope.'
  - name: identity
    description: 'MCP: connected-account profile.'
  - name: brief
    description: 'MCP: the editorial include/exclude policy (one per account).'
  - name: matching
    description: 'MCP: brief-driven discovery of events and organizations.'
  - name: curation
    description: 'MCP: accept/reject overrides that feed matching.'
  - name: evaluation
    description: 'MCP: certify a single item against the brief.'
  - name: seed
    description: 'MCP: learn a brief from a trusted aggregator org.'
  - name: support
    description: 'MCP: report a data/crawl issue to the Momentra team.'
paths:
  /mcp:
    servers:
      - url: https://mcp.momentra.org
        description: >-
          MCP endpoint host. The /mcp JSON-RPC surface lives ONLY here, not on
          the REST origin.
    post:
      tags:
        - mcp
      summary: MCP JSON-RPC 2.0 endpoint (tools/list, tools/call)
      description: >-
        The single MCP transport endpoint, served at
        https://mcp.momentra.org/mcp (NOT on the REST origin). Send a JSON-RPC
        2.0 request. Use `method: "tools/list"` to enumerate tools, or `method:
        "tools/call"` with `params.name` (one of the 24 tools) and
        `params.arguments` (the tool's request schema). The response is a
        JSON-RPC result whose `result.content[0].text` holds the tool's JSON
        payload (account-scoped tools also populate `result.structuredContent`).
        Batch-capable tools return `{ batch: true, count, items: [...] }` when
        given an array input.
      operationId: mcpJsonRpc
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JsonRpcRequest'
            examples:
              toolsList:
                summary: List all tools
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/list
              indexOrg:
                summary: Index an organization
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/call
                  params:
                    name: index_org
                    arguments:
                      website: https://www.findandgoseek.net
              indexOrgForceHigh:
                summary: Index with force_high (go straight to the record/replay crawl)
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/call
                  params:
                    name: index_org
                    arguments:
                      website: https://app.veerio.app/home
                      effort: force_high
                      hints:
                        calendarUrls:
                          - https://app.veerio.app/events
                        eventUrls:
                          - >-
                            https://app.veerio.app/events/vt/middlebury/walking-tour-of-middlebury-mpxkrngv-1
              updateBrief:
                summary: Create an active brief
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/call
                  params:
                    name: update_brief
                    arguments:
                      brief:
                        summary: Family-friendly events in Vermont
                        standards:
                          audienceTypes:
                            - families
                          deliveryHorizonDays: 60
                        geography:
                          zipCode: '05201'
                          radiusMiles: 50
                      status: active
                      clientName: My Brief
              matchingEvents:
                summary: Find events matching the active brief
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/call
                  params:
                    name: matching_events
                    arguments:
                      limit: 25
              seedBrief:
                summary: Learn a brief from an aggregator org
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/call
                  params:
                    name: seed_brief
                    arguments:
                      orgId: org_422c0a39efb3dafc
      responses:
        '200':
          description: >-
            JSON-RPC result. `result.content[0].text` is the tool payload as a
            JSON string; `result.structuredContent` mirrors it for
            account-scoped tools. On a tool-level error, `result.isError` is
            true.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcResponse'
            text/event-stream:
              schema:
                $ref: '#/components/schemas/JsonRpcResponse'
        '401':
          description: >-
            Missing/invalid OAuth token for an oauth2-only tool. The body
            carries an MCP www-authenticate challenge so the host can start the
            OAuth linking flow.
      security:
        - oauth2:
            - mcp
        - {}
components:
  schemas:
    JsonRpcRequest:
      type: object
      required:
        - jsonrpc
        - method
      properties:
        jsonrpc:
          type: string
          const: '2.0'
        id:
          oneOf:
            - type: string
            - type: number
        method:
          type: string
          enum:
            - tools/list
            - tools/call
        params:
          type: object
          description: 'For tools/call: { name, arguments }.'
          properties:
            name:
              type: string
              enum:
                - index_org
                - org_status
                - search
                - fetch
                - search_businesses
                - search_business_events
                - list_orgs
                - get_profile
                - get_brief
                - update_brief
                - matching_events
                - matching_orgs
                - accept_event
                - reject_event
                - accept_org
                - reject_org
                - evaluate_event
                - evaluate_org
                - seed_brief
                - seed_status
                - seed_review
                - seed_reject
                - report_issue
                - recover_account
            arguments:
              description: The chosen tool's request object — one of the Tool_* schemas.
              oneOf:
                - $ref: '#/components/schemas/Tool_index_org'
                - $ref: '#/components/schemas/Tool_org_status'
                - $ref: '#/components/schemas/Tool_search'
                - $ref: '#/components/schemas/Tool_fetch'
                - $ref: '#/components/schemas/Tool_search_businesses'
                - $ref: '#/components/schemas/Tool_search_business_events'
                - $ref: '#/components/schemas/Tool_list_orgs'
                - $ref: '#/components/schemas/Tool_get_profile'
                - $ref: '#/components/schemas/Tool_get_brief'
                - $ref: '#/components/schemas/Tool_update_brief'
                - $ref: '#/components/schemas/Tool_matching_events'
                - $ref: '#/components/schemas/Tool_matching_orgs'
                - $ref: '#/components/schemas/Tool_curation_id'
                - $ref: '#/components/schemas/Tool_evaluate_id'
                - $ref: '#/components/schemas/Tool_seed_brief'
                - $ref: '#/components/schemas/Tool_seed_status'
                - $ref: '#/components/schemas/Tool_seed_review'
                - $ref: '#/components/schemas/Tool_seed_reject'
                - $ref: '#/components/schemas/Tool_report_issue'
                - $ref: '#/components/schemas/Tool_recover_account'
    JsonRpcResponse:
      type: object
      required:
        - jsonrpc
      properties:
        jsonrpc:
          type: string
          const: '2.0'
        id:
          oneOf:
            - type: string
            - type: number
        result:
          type: object
          description: >-
            MCP tool result. The tool payload is the JSON in content[0].text;
            structuredContent mirrors it for account-scoped tools.
          properties:
            content:
              type: array
              items:
                type: object
                properties:
                  type:
                    type: string
                    const: text
                  text:
                    type: string
                    description: The tool payload, JSON-encoded.
            structuredContent:
              type: object
              description: The tool payload as an object (account-scoped tools).
            isError:
              type: boolean
        error:
          type: object
          properties:
            code:
              type: integer
            message:
              type: string
    Tool_index_org:
      type: object
      description: >-
        index (oauth2; 40 credits/org fresh, 10 refresh within 30 days of a
        successful non-empty index, failed crawls refunded). With effort
        'high'/'force_high' a successful crawl costs 80 (an extra 40 surcharge,
        settled only when the heavy record/replay crawl actually produced the
        index). Add one or more organizations' calendars via a fresh crawl.
        Provide `website` OR `websites` (batch up to 100). A 0-event crawl is
        not treated as fresh and is re-crawled next time.
      properties:
        website:
          type: string
          description: A single org website/domain.
        websites:
          type: array
          maxItems: 100
          description: >-
            Batch of up to 100 entries. Each entry is EITHER a plain
            website/domain string OR an object { website, hints } so a caller
            can give different calendar/event URLs to different orgs in one call
            (mix freely).
          items:
            oneOf:
              - type: string
                description: A website/domain.
              - type: object
                required:
                  - website
                properties:
                  website:
                    type: string
                    description: The org website/domain for this entry.
                  hints:
                    $ref: '#/components/schemas/IndexHints'
        startDate:
          type: string
          description: YYYY-MM-DD, defaults to today.
        endDate:
          type: string
          description: YYYY-MM-DD, defaults to +90 days.
        effort:
          type: string
          enum:
            - low
            - high
            - force_high
          default: low
          description: >-
            Crawl effort tier. 'low' (default) runs only the fast in-stack
            scraper. 'high' runs the fast scraper first and escalates to a
            heavier record/replay crawl ONLY if the fast pass finds no events
            (for JS-app / API-driven sites). 'force_high' SKIPS the fast pass
            and goes straight to the record/replay crawl. 'high' and
            'force_high' cost the same (80 on success — 40 more than low) and
            are slower. Applies to every org in a batch.
        hints:
          $ref: '#/components/schemas/IndexHints'
          description: >-
            Known calendar/event page URLs to AUGMENT auto-discovery (appended,
            never a replacement). Applies to a single `website`; for per-org
            hints in a batch, use the object form of `websites`.
    Tool_org_status:
      type: object
      required:
        - jobId
      description: >-
        index (noauth or oauth2; free). Poll an index job. Returns status
        pending|indexing|ready|failed|expired, progress+etaSeconds while
        running, orgId+eventCount when ready (indexStatus:'no_events_found' when
        a completed crawl found nothing).
      properties:
        jobId:
          type: string
          description: The jobId from index_org.
    Tool_search:
      type: object
      required:
        - query
      description: >-
        discover (noauth or oauth2; free). Search events across your indexed
        orgs; OpenAI search contract. Returns { results: [{ id, title, url }] }
        with opaque org:/event: ids for fetch.
      properties:
        query:
          type: string
          description: Free text over organizations and events.
    Tool_fetch:
      type: object
      description: >-
        discover (oauth2; 1 credit per id). Open the full document(s) for search
        id(s); OpenAI fetch contract. Provide `id` OR `ids` (batch up to 500).
      properties:
        id:
          type: string
          description: 'An org: or event: id from search.'
        ids:
          type: array
          items:
            type: string
          maxItems: 500
    Tool_search_businesses:
      type: object
      required:
        - query
      description: >-
        discover (noauth or oauth2; free). Find your indexed organizations by
        name or domain. Returns { count, query, businesses: [Organization] }.
      properties:
        query:
          type: string
          description: Name or domain substring.
    Tool_search_business_events:
      type: object
      description: >-
        discover (noauth or oauth2; free). List one or more organizations'
        upcoming events. Provide orgId OR domain (single), or orgIds OR domains
        (batch up to 500). Returns { organization, eventCount, events: [Event]
        }.
      properties:
        orgId:
          type: string
          description: 'org: prefix tolerated.'
        domain:
          type: string
        orgIds:
          type: array
          items:
            type: string
          maxItems: 500
        domains:
          type: array
          items:
            type: string
          maxItems: 500
    Tool_list_orgs:
      type: object
      description: >-
        discover (noauth or oauth2; free). List every organization in your
        scope. Returns { count, total, organizations: [Organization] }.
        Unauthenticated returns an empty list.
      properties:
        limit:
          type: integer
          minimum: 1
          maximum: 500
          description: Max orgs to return; defaults to all in scope.
    Tool_get_profile:
      type: object
      description: >-
        identity (oauth2; free). Return the connected account's stable opaque
        profile { id, email?, nickname? }. No arguments.
      properties: {}
      additionalProperties: false
    Tool_get_brief:
      type: object
      description: >-
        brief (oauth2; free). Read your editorial brief. Returns { status,
        briefId, briefStatus, clientName?, version, updatedAt, brief } or {
        status:'no_brief' }. No arguments.
      properties: {}
      additionalProperties: false
    Tool_update_brief:
      type: object
      description: >-
        brief (oauth2; free; write, not destructive). Create/update your brief.
        `brief` REPLACES the stored policy document; `status` active is required
        for matching to use it.
      properties:
        brief:
          $ref: '#/components/schemas/Brief'
        status:
          type: string
          enum:
            - draft
            - active
          description: >-
            draft = not used for matching; active = used by
            matching_events/matching_orgs.
        clientName:
          type: string
          description: A label for the brief.
    Tool_matching_events:
      type: object
      description: >-
        matching (oauth2; free). Events that match your ACTIVE brief (found FOR
        you): brief embedded as the query, ranked by similarity, facet-filtered,
        freshness-windowed, curation-honored, scoped to entitled orgs. Returns {
        status, briefId, count,
        matches:[{id,score,title,url,orgId,startEpoch,facets}] };
        no_active_brief when none.
      properties:
        limit:
          type: integer
          minimum: 1
          maximum: 100
          description: Max matches (default 25).
    Tool_matching_orgs:
      type: object
      description: >-
        matching (oauth2; free). Organizations that match your active brief.
        Returns { status, briefId, count,
        matches:[{id,orgId,score,name,domain,categories?,inclusivity?}] };
        requires an active brief.
      properties:
        limit:
          type: integer
          minimum: 1
          maximum: 100
          description: Max matches (default 25).
    Tool_curation_id:
      type: object
      required:
        - id
      description: >-
        curation (oauth2; free; write, not destructive). accept_event /
        reject_event / accept_org / reject_org. accept pins an item into
        matching; reject drops it. `id` is a single id or an array (batch).
        Event ids are event:<orgId>:<eventId>; org ids are org:<orgId>. Returns
        { status:'ok', decision, kind, count, ids }.
      properties:
        id:
          oneOf:
            - type: string
            - type: array
              items:
                type: string
              minItems: 1
    Tool_evaluate_id:
      type: object
      required:
        - id
      description: >-
        evaluation (oauth2; free; read-only). evaluate_event / evaluate_org.
        Certify item(s) against the active brief: exclude rules + facet gate,
        then similarity. `id` is a single id or an array. Returns per item {
        status, id, verdict (fit|weak|reject), similarity?, rulesPass,
        facetPass, reasons[] }; requires an active brief.
      properties:
        id:
          oneOf:
            - type: string
            - type: array
              items:
                type: string
              minItems: 1
    Tool_seed_brief:
      type: object
      description: >-
        seed (oauth2; free; write, not destructive). Learn a brief from a
        trusted aggregator org (events mostly link off-domain, >25% required).
        Provide orgId OR website. Returns { status:'seeding', jobId, orgId,
        offDomainPct, totalEvents } or { status:'not_aggregator', ... }. On
        success a background job converges a brief and sets it active — poll
        seed_status.
      properties:
        orgId:
          type: string
          description: An indexed aggregator org id.
        website:
          type: string
          description: Aggregator website (resolved to an orgId).
    Tool_seed_status:
      type: object
      required:
        - jobId
      description: >-
        seed (oauth2; free; read-only). Poll a seed_brief job. Returns { status
        (seeding|reviewing|ready|failed|not_aggregator), jobId, orgId,
        iteration, maxIterations, fitPct, residualCount, totalEvents, briefId?,
        message }.
      properties:
        jobId:
          type: string
    Tool_seed_review:
      type: object
      required:
        - jobId
      description: >-
        seed (oauth2; free; read-only). Pull borderline events to review
        during/after seeding (near the brief but not clearly on it), re-ranked
        against the latest brief, decided items excluded. Returns { status,
        jobId, seedState, count,
        candidates:[{id,title,orgId,domain,score,reason}] }.
      properties:
        jobId:
          type: string
        limit:
          type: integer
          minimum: 1
          maximum: 50
          description: Max candidates (default 25).
    Tool_seed_reject:
      type: object
      required:
        - jobId
        - ids
      description: >-
        seed (oauth2; free; write, not destructive). Submit events rejected as
        off-brief during a seed review. Records durable negatives AND returns a
        proposed brief tightening + reasoning + clarifying questions (guarded so
        it never blocks the aggregator's own events). Apply via update_brief.
        Returns { status:'ok', jobId, rejectedCount, curationWritten,
        proposedPatch, rationale[], questions[], droppedForGuard[] }.
      properties:
        jobId:
          type: string
        ids:
          type: array
          items:
            type: string
          minItems: 1
          description: Event ids (event:<orgId>:<eventId>) to reject.
    Tool_report_issue:
      type: object
      required:
        - message
      description: >-
        support (noauth or oauth2; free; write, not destructive). Report a
        problem with Momentra data or a crawl (missing events, wrong
        venue/address, an org failing to parse). Emails the Momentra team with
        the message plus auto-collected diagnostics (resolved org, indexed
        eventCount + address, scraper scriptVersion, sample events, related job
        status). Works anonymously; reporter identity is attached when the
        connection is linked. Returns { status:'received', reportId, delivered,
        message }.
      properties:
        message:
          type: string
          description: What you're seeing (required).
        domain:
          type: string
          description: The org website/domain the issue is about, if any.
        orgId:
          type: string
          description: The Momentra orgId the issue is about, if known.
        jobId:
          type: string
          description: >-
            A related index/scrape jobId, if the issue concerns a specific
            crawl.
        email:
          type: string
          description: Where to reply. Optional if the connection is linked.
    Tool_recover_account:
      type: object
      description: >-
        identity (oauth2; free; write, not destructive). Recover a previous
        account's purchased credits after reconnecting with a new login. Takes
        NO arguments — returns a LINK (recoveryUrl) to the Momentra
        /recover/start page. On that page the user enters the email tied to the
        prior account; a confirmation LINK is then emailed to that address (no
        email or code typed into chat — works in connectors that can't relay
        either). Opening the emailed link on the /recover page and confirming
        REBINDS the current connection onto the recovered account (its balance +
        history kept) and consolidates duplicate same-email accounts into it.
        Same-email gated; the emailed link is single-use, 15-min TTL,
        rate-limited; nothing is duplicated and the free-signup grant is never
        re-run. Returns { status: start | error, message, recoveryUrl }.
      properties: {}
    IndexHints:
      type: object
      description: >-
        Caller-supplied discovery hints appended to (never replacing)
        auto-discovered URLs. Both lists are http(s)-only, deduped, and capped
        at 50.
      properties:
        calendarUrls:
          type: array
          items:
            type: string
          maxItems: 50
          description: Known calendar/listing page URLs.
        eventUrls:
          type: array
          items:
            type: string
          maxItems: 50
          description: Known single-event detail page URLs.
    Brief:
      type: object
      description: >-
        The editorial policy document. All fields optional; an empty facet group
        means 'no restriction'. update_brief replaces it wholesale.
      properties:
        summary:
          type: string
          description: >-
            Semantic query text: matching embeds this + eventKinds.include and
            ranks by similarity.
        standards:
          type: object
          description: >-
            Closed-vocabulary facet filters (enabled values allowed through).
            Fail-open: events missing a facet are never dropped.
          properties:
            ageBands:
              type: array
              items:
                type: string
                enum:
                  - general
                  - babies
                  - toddlers
                  - kinder
                  - kids
                  - tweens
                  - teens
                  - all_ages
            audienceTypes:
              type: array
              items:
                type: string
                enum:
                  - families
                  - children_with_adult
                  - adults
                  - seniors
                  - students
                  - professionals
            commercialIntent:
              type: array
              items:
                type: string
                enum:
                  - programmed_event
                  - promotion_only
                  - unknown
            religiousContent:
              type: array
              items:
                type: string
                enum:
                  - worship_or_service
                  - faith_related_non_service
                  - none
                  - unknown
            accessRestrictions:
              type: array
              items:
                type: string
                enum:
                  - registration_required
                  - ticket_required
                  - members_only
                  - students_only
                  - age_restricted
                  - invite_only
            eventCategories:
              type: array
              items:
                type: string
                enum:
                  - live_music
                  - food_drink
                  - performing_arts
                  - outdoors
                  - family_friendly
                  - educational
                  - fundraiser
            programmingNature:
              type: array
              items:
                type: string
                enum:
                  - performance
                  - class_or_workshop
                  - social_gathering
                  - meeting
                  - exhibit
                  - market_or_sale
                  - fundraiser
                  - other
            deliveryHorizonDays:
              type: integer
              description: Freshness window in days.
            sourceDeny:
              type: array
              items:
                type: string
              description: Source domains to exclude.
            sourceAllow:
              type: array
              items:
                type: string
        eventKinds:
          type: object
          properties:
            include:
              type: array
              items:
                type: string
            exclude:
              type: array
              items:
                type: string
        geography:
          type: object
          description: Hard geo gate.
          properties:
            zipCode:
              type: string
            radiusMiles:
              type: number
        excludePhrases:
          type: array
          items:
            type: string
          description: Deterministic title-phrase excludes.
  securitySchemes:
    oauth2:
      type: oauth2
      description: >-
        MCP auth: OAuth 2.1 + PKCE with Client ID Metadata Documents (CIMD).
        Authorization-server metadata (RFC 8414) and protected-resource metadata
        (RFC 9728) are served from the MCP endpoint origin (mcp.momentra.org).
      flows:
        authorizationCode:
          authorizationUrl: https://mcp.momentra.org/authorize
          tokenUrl: https://mcp.momentra.org/token
          scopes:
            mcp: Access the Momentra Events MCP tools for the linked account.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.