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 CLASSIFY_PATTERNS
Patterns that suggest simple pass-through to intent classifier These are ambiguous but likely simple
# constant DATABASE_SCHEMAS
Database schema definitions for AI query generation These are simplified schemas that tell AI what fields are queryable
# constant DIRECT_ACTION_PATTERNS
Direct action patterns - high confidence, single step These bypass any AI reasoning and execute immediately
# 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 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 SIMPLE_QUERY_PATTERNS
Simple query patterns - single database fetch These use the existing query_data tool
# 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)
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 _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
meetingnode with the session's roomId — drilling shows participants. - If a day has multiple sessions: that node is a
dategroup— drilling shows the individual sessions.
# 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
# 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
# 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>
# 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)>
# formatStoredSummary()
Format a stored transcription summary (ai_analysis or openai_analysis) as readable text Returns null if the summary is incomplete or missing
# 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
# 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>
# 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>
# 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
# 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
# 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>
# 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
# 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>
# 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:
- Loads transcriptions for the specified room/recording (includes sentiment data)
- Creates an AI session with transcript+sentiment context
- 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 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 }]
|
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
# 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 |
# startMeeting(params, securityContext) → {Promise.<Object>}
Start a meeting room
Two modes:
- Instant meeting (no roomName) - frontend creates room via InstantRoomDialog flow
- 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:
- Using stored responseId from OpenAI Responses API (persists ~30 days)
- 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>