Global

Members

# constant AGENT_TRIGGERS

Agent trigger patterns - complexity indicators that require reasoning If any of these match, route to the agent

# constant ActionTypes

MCP Action Types

Contract between MCP Server and Frontend. When MCP executes a tool, it returns an action object that tells the frontend what client-side action to take.

# constant CANCEL_PHRASES

Phrases that indicate user wants to cancel/abandon a pending action

# constant CLASSIFY_PATTERNS

Patterns that suggest simple pass-through to intent classifier These are ambiguous but likely simple

# constant ConfirmationTypes

Confirmation types for CONFIRMATION_REQUIRED action

# constant DATABASE_SCHEMAS

Database schema definitions for AI query generation These are simplified schemas that tell AI what fields are queryable

# constant DEFAULT_CONFIG

Default configuration

# constant DIRECT_ACTION_PATTERNS

Direct action patterns - high confidence, single step These bypass any AI reasoning and execute immediately

# constant EXTRACTION_PROMPTS

Extraction type prompts

# constant FILE_OPEN_TRIGGERS

Direct file open patterns - single file open action These need agent routing because they require finding the file first, then returning VIEW_FILE action

# constant FILE_QUERY_TRIGGERS

File query patterns - listing/finding files (whiteboards, notes, documents) These need agent routing because they require query_files with specific parameters

# constant FOLLOW_UP_TEMPLATES

Follow-up question templates for missing parameters

# constant PRIMITIVE_TOOLS

Tool metadata for agent orchestrator Maps tool names to their implementations and descriptions

# constant REQUIRED_PARAMS

Required parameters for action tools These must be collected before execution

# constant RouteType

Route types

# constant SIMPLE_QUERY_PATTERNS

Simple query patterns - single database fetch These use the existing query_data tool

# constant SUMMARY_PROMPTS

Summary type prompts

# constant StepType

Agent step types (for reasoning display)

# constant TRANSCRIPT_VIEW_TRIGGERS

Direct transcript view patterns - VIEW/SHOW a specific transcript These route to agent which uses get_transcript tool (returns VIEW_TRANSCRIPT action)

# _aiServiceInstance

Cached UnifiedAIService instance (singleton)

# constant buildSecurityContext

Build security context for MCP tool calls

Methods

# _buildMeetingsGraph()

Build a star graph of you → distinct meeting rooms.

Room records in the history are per-session — the same room name can appear hundreds of times (each session = one Room document). Showing every session as its own node is noisy AND causes node-id collisions in the force graph. We dedupe by name here: one node per distinct room name, with the session count and the most-recent session date carried on properties. Drilling into a room node fetches that room's participants.

# _buildRecordingsGraph()

Build a star graph of you → distinct recorded rooms.

Same dedup strategy as _buildMeetingsGraph: multiple recordings often share the same roomName (one recording per session of a re-used room). Showing every recording as a separate node is noisy and causes node-id collisions in the force graph, which orphans most nodes from "You". Dedupe by roomName, carry a recording count + latest date on properties.

# async _expandDateGroup()

Expand a date-group node into the individual sessions of a room on that day.

# async _expandMeeting()

Expand a meeting node into its participants.

# async _expandPerson()

Expand a person node.

  • If the person IS the current user → list all meetings they attended.
  • Otherwise → list meetings the two of them SHARED (we can't query another user's full meeting history without org-owner auth; shared meetings are data the current user already participated in, so they're safe to read).

# async _expandRoomSessions()

Expand a deduped room node (sessionCount > 1) into per-day session nodes.

  • One node per distinct day on which a session of this room occurred.
  • If a day has exactly one session: that node is a regular meeting node with the session's roomId — drilling shows participants.
  • If a day has multiple sessions: that node is a dategroup — drilling shows the individual sessions.

# async _expandSummary()

Expand a stats summary node into the actual entities of that type.

# addBreadcrumbLabel()

Helper to append a breadcrumbLabel to a createGraphResponse result.

# analyzeQuery()

Get routing analysis for a query Useful for debugging

# answerQuestion(params) → {Promise.<Object>}

Answer a specific question about provided text

Parameters:
Name Type Description
params Object

Parameters

text string

Text to answer question about

question string

Question to answer

citeSources boolean

Include citations from text (default: true)

Answer result

Promise.<Object>

# applyAuthorizationFilters(query, userContext, type) → {Object}

Apply authorization filters to a query based on user context

Parameters:
Name Type Description
query Object

MongoDB query object

userContext Object

User context with apiKey

type string

Resource type ('room', 'schedule')

Modified query with authorization filters

Object

# buildUserContext(user) → {Object}

Build authorization context for tools Extracts and normalizes user information from request

Parameters:
Name Type Description
user Object

User object from authentication middleware

Normalized user context

Object

# calculateNextOccurrence()

Calculate next occurrence for recurring schedules

# async callAI()

Call AI API

# cancelSchedule(params, securityContext) → {Promise.<Object>}

Cancel a scheduled meeting

Parameters:
Name Type Description
params Object

Parameters

scheduleId string

Schedule ID to cancel (required)

reason string

Cancellation reason

notifyParticipants boolean

Send cancellation emails (default: true)

securityContext Object

User security context

Result with action for frontend

Promise.<Object>

# checkTranscriptions(params, securityContext) → {Promise.<Object>}

Check which rooms have transcription data

Parameters:
Name Type Description
params Object

Parameters

roomNames Array.<string>

Specific rooms to check (optional)

limit number

Max rooms to return (default: 20)

recentFirst boolean

Sort by most recent transcription

securityContext Object

User security context

Rooms with transcription status

Promise.<Object>

# cleanParticipantName()

Clean participant name by removing timestamp (prefix or suffix) If name is "Unknown", fall back to participant_id with timestamp removed e.g., "1765915346271_its_me_again" → "its_me_again" e.g., "karl_1734567890123" → "karl"

# createDbAdapter()

Create a minimal dbConnection adapter for GraphContextService Uses models from dependency injection instead of raw mongoose.connection.db

# createMCPServer(configopt) → {Object}

Create and initialize the MCP Server

Models and AI services are bundled internally. Callers only need to provide aiConfig (API keys) and ensure the database connection is established.

Parameters:
Name Type Attributes Description
config Object <optional>

Configuration object

models Object <optional>

Override default models from muziertc-models

utils Object <optional>

Optional utility overrides

aiConfig Object

AI provider configuration

aiConfig.openaiKey string <optional>

OpenAI API key

aiConfig.xaiKey string <optional>

xAI/Grok API key

MCP server components

Object

# createRoom(params, securityContext) → {Promise.<Object>}

Create a new persistent room

Parameters:
Name Type Description
params Object

Parameters

roomName string

Name for the room (required)

password string

Password for the room (optional - if provided, usePassword is auto-enabled)

usePassword boolean

Require password to join

useWaitingRoom boolean

Enable waiting room

enableOffline boolean

Enable offline features (default: true)

autoIntelligence boolean

Auto-start transcription/recording (default: false)

securityContext Object

User security context

Result with action for frontend

Promise.<Object>

# createSchedule(params, securityContext) → {Promise.<Object>}

Create a scheduled meeting

Parameters:
Name Type Description
params Object

Parameters

roomName string

Meeting name (required)

startDateTime string

Start date/time ISO string (required)

endDateTime string

End date/time (optional)

duration number

Duration in minutes (default: 60)

participants Array.<string>

Email addresses to invite

description string

Meeting description

recurrence Object

Recurrence pattern { type, interval, count }

securityContext Object

User security context

Result with action for frontend

Promise.<Object>

# ensureAIClient()

Initialize AI client (lazy) Uses shared getAIClient utility for OpenAI/xAI support

# async executeAgent()

Execute via agent orchestrator (complex queries)

# async executeDirect()

Execute a direct action (fast path)

# async executeSimple()

Execute a simple query (single database fetch)

# expandGraphNode(params, securityContext) → {Promise.<Object>}

Expand a graph node into its next level.

Hierarchy: stats summary node (summary_person, summary_meeting, summary_recording, summary_topic) → the actual entities of that type person node → meetings that person attended meeting node → participants of that meeting

Parameters:
Name Type Description
params Object
nodeId string

The graph node id (e.g. "summary_meeting", "person_alice_at_x_com")

nodeType string

Node type: 'person' | 'meeting' | 'recording' | 'topic' | 'summary'

properties Object

Node properties (email, roomName, entityType, ...)

limit number

Max children to return (default: 20)

securityContext Object

{ success, graph: { nodes, edges, metadata }, graphType, breadcrumbLabel }

Promise.<Object>

# extractDisplayNameFromEmail()

Extract display name from email (must match graph-visualization.js)

# extractInfo(params) → {Promise.<Object>}

Extract structured information from text

Parameters:
Name Type Description
params Object

Parameters

text string

Text to extract from

extractType string

Type of extraction: 'action-items', 'decisions', 'participants', 'dates', 'topics', 'questions', 'sentiment'

context string

Optional context about the text

Extraction result

Promise.<Object>

# filterOutBots()

Filter out bot users from participant arrays Bot prefixes: recorder_, rectrans_, streamer_, transcriber_

# findCollaborators(params, securityContext) → {Promise.<Object>}

Find collaborators for a person based on shared meeting attendance

Parameters:
Name Type Description
params Object

Query parameters

personEmail string

Email of person to find collaborators for (optional, defaults to current user)

minMeetings number

Minimum shared meetings (default: 1)

timeframe string

Time range: 'last_week', 'last_month', 'last_quarter', 'last_year'

startDate string | Date

Specific start date for filtering (ISO string or Date)

endDate string | Date

Specific end date for filtering (ISO string or Date)

limit number

Max results (default: 20)

includeTeam boolean

Include team members' data (org owners only)

excludeSelf boolean

Exclude the requesting user from results (default: true)

securityContext Object

User security context

Collaborator list

Promise.<Object>

# findRecordingsByTopic(params, securityContext) → {Promise.<Object>}

Find recordings that cover a specific topic (via COVERS relationships)

Parameters:
Name Type Description
params Object

Query parameters

topic string

Topic name to search for

minConfidence number

Minimum confidence (0-1, default: 0.5)

limit number

Max results (default: 20)

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Matching recordings

Promise.<Object>

# findRelatedTopics(params, securityContext) → {Promise.<Object>}

Find topics related to a given topic via shared meetings

Parameters:
Name Type Description
params Object

Query parameters

topic string

Topic name or partial match

maxHops number

Maximum graph traversal depth (default: 2)

limit number

Max results (default: 20)

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Related topics

Promise.<Object>

# findSimilarTopics(params, securityContext) → {Promise.<Object>}

Find semantically similar topics using embedding vectors

Parameters:
Name Type Description
params Object

Query parameters

query string

Text to find similar topics for (required)

limit number

Max results (default: 10)

minSimilarity number

Minimum similarity threshold 0-1 (default: 0.7)

securityContext Object

User security context

Similar topics with similarity scores

Promise.<Object>

# async findStoredRoom(roomName, cleanedOwner, apiKey) → {Promise.<(Object|null)>}

Find a stored room by name (exact match or base name without suffix)

Parameters:
Name Type Description
roomName string

Room name to search for

cleanedOwner string

Cleaned owner user ID

apiKey string

Organization API key

Stored room or null

Promise.<(Object|null)>

# formatDate()

Format date for display

# formatDuration()

Format duration in minutes to human-readable string

# formatExamplesForPrompt()

Format examples from JSON into prompt text

# formatMeetingDate()

Format a date as a short label (e.g. "May 14, 2026")

# formatStoredSummary()

Format a stored transcription summary (ai_analysis or openai_analysis) as readable text Returns null if the summary is incomplete or missing

# formatTranscriptWithSentiment()

Format transcriptions with sentiment data for AI context

# generateResponse(params) → {Promise.<Object>}

Generate a user-friendly response from structured data

Parameters:
Name Type Description
params Object

Parameters

query string

Original user query

data Object | Array

Data to format into response

dataType string

Type of data: 'rooms', 'schedules', 'files', 'search_results', etc.

format string

Output format: 'text', 'markdown', 'table' (default: 'markdown')

Formatted response

Promise.<Object>

# getAIService()

Get or create a configured UnifiedAIService instance (cached singleton) Uses dependency injection for API keys

# getAccessibleRoomIds(userId, apiKey) → {Promise.<Array.<string>>}

Get IDs of rooms the user has access to (owns or participates in)

Parameters:
Name Type Description
userId string

User's email or clean user ID

apiKey string

User's apiKey for organization filtering

Array of accessible room IDs

Promise.<Array.<string>>

# getAccessibleScheduleIds(userId, apiKey) → {Promise.<Array.<string>>}

Get IDs of schedules the user has access to (organizer or invited)

Parameters:
Name Type Description
userId string

User's email

apiKey string

User's apiKey for organization filtering

Array of accessible schedule IDs

Promise.<Array.<string>>

# getCollaboratorGraph(params, securityContext) → {Promise.<Object>}

Get collaborator network as a visualization-ready graph Returns both summary text and graph data for force-directed visualization

Parameters:
Name Type Description
params Object

Query parameters (same as findCollaborators)

securityContext Object

User security context

Response with summary, graph, and VIEW_GRAPH action

Promise.<Object>

# getDependencies() → {Object}

Get current dependencies Used by MCP components to access models, services, utils

If dependencies not initialized

Error

Dependencies object

Object

# getEmbeddingService()

Helper to get embedding service from dependency injection

# getFollowUpQuestion()

Get follow-up question for tools that need more info

# getGraphContextService()

Get GraphContextService from dependencies

# getGraphStats(params, securityContext) → {Promise.<Object>}

Get statistics about the knowledge graph

Parameters:
Name Type Description
params Object

Query parameters

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Graph statistics

Promise.<Object>

# getMeetingTopics(params, securityContext) → {Promise.<Object>}

Get topics discussed in a specific meeting

Parameters:
Name Type Description
params Object

Query parameters

roomName string

Room/meeting name

roomId string

Room ID (alternative to roomName)

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Meeting topics

Promise.<Object>

# getModels()

Helper to get models from dependency injection

# getNetworkStatsGraph(params, securityContext) → {Promise.<Object>}

Get network statistics as a visualization-ready graph Shows entity counts around the current user

Parameters:
Name Type Description
params Object

Query parameters

securityContext Object

User security context

Response with summary, graph, and VIEW_GRAPH action

Promise.<Object>

# getOpenAIToolDefinitions()

Format tools for OpenAI function calling

# getPersonMeetings(params, securityContext) → {Promise.<Object>}

Get meetings attended by a person

Parameters:
Name Type Description
params Object

Query parameters

personEmail string

Email of person (optional, defaults to current user)

limit number

Max results (default: 50)

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Meeting list

Promise.<Object>

# getRecordingParticipants(params, securityContext) → {Promise.<Object>}

Get all participants (speakers) in a specific recording

Parameters:
Name Type Description
params Object

Query parameters

recordingId string

Recording ID

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Participant list with speaking stats

Promise.<Object>

# getRecordingsForPerson(params, securityContext) → {Promise.<Object>}

Get recordings where a person spoke (via SPOKE_IN relationships)

Parameters:
Name Type Description
params Object

Query parameters

personEmail string

Email of person (optional, defaults to current user)

limit number

Max results (default: 20)

includeTeam boolean

Include team members' data (org owners only)

securityContext Object

User security context

Recording list

Promise.<Object>

# getStructuredSummaryPrompt()

Get a structured JSON prompt for generating cacheable summaries Returns JSON that matches the openai_analysis format used by existing viewers

# getSummaryPrompt()

Get summary prompt based on summary type CRITICAL: All prompts explicitly prevent hallucination

# getToolCategories()

Get tool categories

# getToolDefinition()

Get tool definition by name

# getTopicExtractionService()

Get TopicExtractionService from dependencies

# getTranscript(params, securityContext) → {Promise.<Object>}

Get transcript content for a room

Parameters:
Name Type Description
params Object

Parameters

roomName string

Room name to get transcript for

roomId string

Alternatively, room ID

meetingOffset number

Skip N most recent meetings (0=most recent, 1=second to last, etc.)

limit number

Max transcript entries (default: 500)

format string

'raw' (array) or 'formatted' (text with speakers)

securityContext Object

User security context

Transcript data

Promise.<Object>

# getTranscriptionModel()

Helper to get Transcription model - prefer this over raw collection access

# getUtils()

Helper to get utils from dependency injection

# handleAgentQuery(query, userContext, options) → {Promise.<Object>}

Handle a user query using the agent system

This is the main entry point for the new agent architecture. It uses SmartRouter to determine the best execution path.

Parameters:
Name Type Description
query string

User's natural language query

userContext Object

User context from MCP client

options Object

Execution options

showReasoning boolean

Include reasoning steps

forceAgent boolean

Force agent execution (skip routing)

fallbackHandler function

Fallback for classify route

Response with summary, action, and optional steps

Promise.<Object>

# hasInitialized() → {boolean}

Check if dependencies have been initialized

boolean

# highlightMatch()

Highlight matching text in search results

# isValidEmail(email) → {boolean}

Validate email address format

Parameters:
Name Type Description
email string

Email to validate

True if valid email format

boolean

# isValidTimezone(timezone) → {boolean}

Validate IANA timezone string

Parameters:
Name Type Description
timezone string

Timezone to validate

True if valid timezone

boolean

# loadQueryExamples()

Load query examples from JSON file (lazy loaded)

# normalizeResultRoomNames()

Normalize room names in query results for cleaner display

# normalizeRoomName()

Normalize room name by stripping the alias suffix (random chars after last dash) Only strips if the suffix looks like a generated alias (7 lowercase alphanumeric chars) e.g., "my-room-abc1234" -> "my-room" (stripped - matches alias pattern) e.g., "team-standup" -> "team-standup" (kept - "standup" is not 7 chars)

# openFile(params, securityContext) → {Promise.<Object>}

Open a file for viewing - returns file metadata and VIEW_FILE action

Parameters:
Name Type Description
params Object

Parameters

resourceType string

Type of file: 'usernote', 'assignment', 'image', 'recording', etc.

roomName string

(Optional) Filter by room name

fileName string

(Optional) Filter by file name pattern

offset number

Skip N files (0=most recent, 1=second to last, etc.)

order string

'newest' (default) or 'oldest'

securityContext Object

User security context

File data with VIEW_FILE action

Promise.<Object>

# parseRelativeDate()

Parse relative date strings to Date objects

# prettifyRoomName()

Prettify room name for display

  • Removes random suffix (6-10 alphanumeric chars after last hyphen)
  • Converts hyphens/underscores to spaces
  • Applies Title Case

# prettifyRoomNamesInResponse()

Post-process AI response to prettify room names Looks for patterns like "room-name-abc123" and prettifies them Handles room names in markdown bold (name), quotes, or plain text

# queryFiles(params, securityContext) → {Promise.<Object>}

Query files and documents

Parameters:
Name Type Description
params Object

Query parameters

resourceType string

Filter by type (whiteboard, document, live-transcript, etc.)

roomName string

Filter by room

fileName string

Filter by file name (partial match)

foldersOnly boolean

Only return folders

filesOnly boolean

Exclude folders

sort Object

Sort specification

limit number

Max results

securityContext Object

User security context

Query results

Promise.<Object>

# queryMeetingContext(params, securityContext) → {Promise.<Object>}

Query meeting mood/sentiment using live context approach

This function:

  1. Loads transcriptions for the specified room/recording (includes sentiment data)
  2. Creates an AI session with transcript+sentiment context
  3. Queries the AI with the user's question
Parameters:
Name Type Description
params Object

Parameters

roomName string

Room name to query

recordingId string

Optional specific recording ID

query string

User's question about mood/sentiment

securityContext Object

User security context

AI response with mood analysis

Promise.<Object>

# queryRecordings(params, securityContext) → {Promise.<Object>}

Query recordings

Parameters:
Name Type Description
params Object

Query parameters

roomName string

Filter by room name

status string

Filter by status

compositionStatus string

Filter by composition status

sort Object

Sort specification

limit number

Max results

securityContext Object

User security context

Query results

Promise.<Object>

# queryRooms(params, securityContext) → {Promise.<Object>}

Query room/meeting history with filters

Parameters:
Name Type Description
params Object

Query parameters

filter Object

MongoDB filter object (optional)

roomName string

Filter by room name (partial match)

participants Array.<string>

Filter by participant emails

startAfter string

Filter meetings after this date

startBefore string

Filter meetings before this date

completedOnly boolean

Only return completed meetings (timeEnded != null)

activeOnly boolean

Only return active meetings

sort Object

Sort specification (default: { timeStarted: -1 })

limit number

Max results (default: 20, max: 100)

computeDuration boolean

Include computed duration field

securityContext Object

User security context

Query results

Promise.<Object>

# async queryRoomsForExpansion()

Fetch recent rooms for the current user (used by summary_meeting expansion). Mirrors queryRooms behavior but scoped to expansion needs to keep this primitive self-contained (no circular dep on data-queries).

Room.userIds stores CLEANED user IDs (e.g. "karlreti_t3@gmail_com"), so we must clean the email before querying — otherwise the filter never matches.

# querySchedules(params, securityContext) → {Promise.<Object>}

Query scheduled meetings

Parameters:
Name Type Description
params Object

Query parameters

filter Object

MongoDB filter object (optional)

roomName string

Filter by room name (partial match)

upcoming boolean

Only return upcoming schedules

includePast boolean

Include past schedules (default: false for upcoming)

includeRecurring boolean

Include recurring schedules even if start date is past

status string

Filter by status (pending, sent, cancelled)

sort Object

Sort specification

limit number

Max results (default: 20)

securityContext Object

User security context

Query results

Promise.<Object>

# queryStoredRooms(params, securityContext) → {Promise.<Object>}

Query user's saved/stored rooms

Parameters:
Name Type Description
params Object

Query parameters

roomName string

Filter by room name (partial match)

sort Object

Sort specification

limit number

Max results

securityContext Object

User security context

Query results

Promise.<Object>

# async rehydrateAndQuery()

Create AI session with mood context and query

# async rehydrateAndSummarize()

Rehydrate a transcript by creating a new AI session and pushing the data Also caches the structured summary to the Recording document for future use

# requestInput(params, securityContext) → {Promise.<Object>}

Request input from user via a dynamic form AI uses this when it needs more information to complete an action

Parameters:
Name Type Description
params Object

Parameters

message string

Message explaining what's needed

targetTool string

Tool to call after collecting input (create_schedule, start_meeting, etc.)

fields Array

Fields to collect: [{ name, label, type, required, placeholder }]

  • type: 'text', 'datetime', 'duration', 'emails', 'select'
prefilled Object

Values already extracted (will be passed to target tool)

securityContext Object

User security context

NEEDS_INFO action for frontend

Promise.<Object>

# resolvePersonQuery(requestedEmail, currentUserEmail, isOrgOwner) → {string}

Resolve the personEmail the AI agent supplied into the effective account to query, then authorize it. The agent frequently passes a self-reference in a form other than the raw account email — the cleaned userId form fed to it via room/participant context, or the user's first name / nickname. A non-org-owner can only ever query themselves, so any such reference (and any bare name, which is never a cross-account email) resolves to the current user instead of being mistaken for someone else and denied.

Parameters:
Name Type Description
requestedEmail string | undefined

personEmail from the tool params

currentUserEmail string

the requesting user's account email

isOrgOwner boolean

whether the requester is an org owner

if a non-owner targets a concrete other account

the effective email to query

string

# sanitizeNodeId()

Sanitize a string for use as a node ID (must match graph-visualization.js)

# searchContent(params, securityContext) → {Promise.<Object>}

Search through meeting transcriptions, chats, documents, and topics using semantic similarity

Parameters:
Name Type Description
params Object

Search parameters

query string

Search query (what to find)

contentTypes Array.<string>

Types to search: 'transcriptions', 'chats', 'documents', 'topics'

roomName string

Filter to specific room name

roomId string

Filter to specific room ID

roomNames Array.<string>

Filter to multiple rooms

startAfter string

Filter content after this date

startBefore string

Filter content before this date

limit number

Max results per type (default: 10)

minScore number

Minimum relevance score (default: 0.6)

securityContext Object

User security context

Search results

Promise.<Object>

# searchTranscriptions(params, securityContext) → {Promise.<Object>}

Simple text search in transcriptions (faster than semantic search)

Parameters:
Name Type Description
params Object

Search parameters

query string

Text to search for

roomName string

Filter to specific room

speaker string

Filter to specific speaker

limit number

Max results (default: 50)

securityContext Object

User security context

Search results

Promise.<Object>

# sendInvites(params, securityContext) → {Promise.<Object>}

Send meeting invites to participants (This is typically handled by frontend, but can be triggered as action)

Parameters:
Name Type Description
params Object

Parameters

roomLink string

Room link to share

participants Array.<string>

Email addresses to invite

message string

Optional custom message

securityContext Object

User security context

Result with action for frontend

Promise.<Object>

# setDependencies(deps)

Set dependencies for use by all MCP components Called by createMCPServer during initialization

Parameters:
Name Type Description
deps Object

Dependencies object

# shouldUseAgent()

Check if a query should use the agent Can be used by external code to pre-check

# startMeeting(params, securityContext) → {Promise.<Object>}

Start a meeting room

Two modes:

  1. Instant meeting (no roomName) - frontend creates room via InstantRoomDialog flow
  2. Existing room (with roomName) - frontend starts existing room from RoomsList
Parameters:
Name Type Description
params Object

Parameters

roomName string

Room name (optional - if not provided, starts instant meeting)

participants Array.<string>

Email addresses to invite

password string

Password for the room (optional)

copyLinkToClipboard boolean

Copy room link to clipboard

securityContext Object

User security context

Result with action for frontend

Promise.<Object>

# summarizeText(params) → {Promise.<Object>}

Generate AI summary of provided text

Parameters:
Name Type Description
params Object

Parameters

text string

Text to summarize (transcript, notes, etc.)

summaryType string

Type of summary: 'meeting-summary', 'action-items', 'key-decisions', 'full', 'brief'

context string

Optional context about the text

maxLength number

Max output length in tokens (default: 1000)

Summary result

Promise.<Object>

# summarizeTranscript(params, securityContext) → {Promise.<Object>}

Summarize a meeting transcript using stored AI context (responseId)

This tool avoids passing large transcript text through JSON by:

  1. Using stored responseId from OpenAI Responses API (persists ~30 days)
  2. Falling back to rehydration if responseId is expired
Parameters:
Name Type Description
params Object

Parameters

roomName string

Room name to get transcript for

summaryType string

Type: 'meeting-summary', 'action-items', 'key-decisions', 'full'

securityContext Object

User security context

Summary result

Promise.<Object>

# validateISODate(dateStr) → {Object}

Validate ISO 8601 date string

Parameters:
Name Type Description
dateStr string

Date string to validate

{ valid: boolean, date: Date|null, error: string|null }

Object

# validatePersonQueryAccess(requestedEmail, currentUserEmail, isOrgOwner)

Validate that the user is authorized to query another person's data. Only org owners can query other users' data within their organization.

Both emails are normalized with cleanUserId (not just lowercased) before comparison. This is the identity form used everywhere else in the system (Room.owner, participant lists, the identity fed to the AI agent), so a self-query expressed in the cleaned form — e.g. the agent passing karlreti_s4@gmail_com when the account email is karlreti+s4@gmail.com — is correctly recognized as the current user instead of being denied. Genuinely different accounts still clean to different ids, so cross-user access remains blocked for non-owners.

Parameters:
Name Type Description
requestedEmail string

The email being queried

currentUserEmail string

The requesting user's email

isOrgOwner boolean

Whether the requesting user is an org owner

If user is not authorized to query the requested email

# validateRoomAccess(roomId, userContext) → {Promise.<Object>}

Check if user has access to a specific room

Parameters:
Name Type Description
roomId string

Room ID to check

userContext Object

User context with userId, email, and apiKey

If user doesn't have access

Room document if user has access

Promise.<Object>

# validateRoomOwnership(roomId, userContext) → {Promise.<Object>}

Check if user owns a room (required for sensitive operations like transcriptions)

Parameters:
Name Type Description
roomId string

Room ID to check

userContext Object

User context with userId, email, and apiKey

If user is not the owner

Room document if user is owner

Promise.<Object>

# validateScheduleAccess(scheduleId, userContext) → {Promise.<Object>}

Validate user access to a schedule

Parameters:
Name Type Description
scheduleId string

Schedule ID to check

userContext Object

User context with userId, email, and apiKey

If user doesn't have access

Schedule document if user has access

Promise.<Object>

# validateScheduleModifyAccess(scheduleId, userContext) → {Promise.<Object>}

Validate user can modify a schedule (must be organizer or admin)

Parameters:
Name Type Description
scheduleId string

Schedule ID to check

userContext Object

User context with userId, email, and apiKey

If user can't modify

Schedule document if user can modify

Promise.<Object>