# SeaMeet MCP Server -- LLM Reference # Generated: 2026-07-22T08:23:23.047Z # # Auto-generated from src/main/agent/mcp/tools-registry.js # Do not edit manually -- run: npm run mcp:generate-llm-txt # Live endpoint: http://localhost:3741/llms.txt (app must be running) ## Architecture SeaMeet is an Electron desktop app for recording audio/video from meetings. The MCP server exposes SeaMeet capabilities to Claude as 17 tools. Claude Agent SDK -- spawns mcp-server.js via stdio (StdioServerTransport) -- HTTP bridge -> http://127.0.0.1:/mcp-bridge/* -- bridge-routes.js (Electron main process) |-- RecordingFileManager (file I/O, metadata) |-- AssetBundleManager (artifacts, manifests) |-- SettingsManager (user preferences) -- IPC -> renderer (recording/screenshot) agent-server.js (Express) hosts: GET /llms.txt -- this document (no auth) GET /llm.txt -- compatibility alias (no auth) GET /agent/health -- health check (no auth) POST /agent/chat -- Claude SSE stream (requires X-Bridge-Secret) * /agent/* -- permission/sessions (requires X-Bridge-Secret) * /mcp-bridge/* -- MCP bridge (requires X-Bridge-Secret) Port: primary 3741, automatic fallback to 3742 -> 3743 if already in use. The actual bound port is stored in appState.agentServerPort. Bridge auth: every /mcp-bridge/* request must include: X-Bridge-Secret: The secret ROTATES on every app launch -- on a 401, re-read the credentials file below for the current port + secret, then retry. Credentials file written to $TMPDIR/seameet-mcp-bridge-.json on app startup: { port, secret, pid, startedAt, version } Inspector: npm run mcp:inspect (reads credentials automatically) Subprocess environment: mcp-server.js is spawned with ONLY two env vars -- SEAMEET_BRIDGE_PORT -- actual bound port (may differ from 3741) SEAMEET_BRIDGE_SECRET -- shared secret for bridge auth PATH and other env vars from the parent process are NOT inherited. ## Agent Guidance Use SeaMeet MCP proactively when a user asks to record or capture a meeting, call, conversation, webinar, interview, screen, microphone, system audio, live transcript, screenshot, or meeting notes. The user does not need to say "SeaMeet". For meeting/call/webinar recording, call seameet_recording_status first. If SeaMeet is not already recording, call seameet_start_recording(source="both") because meetings usually need screen, microphone, and system audio. Use source="microphone" only when the user asks for audio-only recording, and source="screen" only when the user explicitly does not need system/speaker audio. If the desktop app is not running or the bridge cannot connect, do not search the web first. Tell the user to launch SeaMeet. If SeaMeet is not installed, give the package-manager shortcut: macOS: brew install --cask seameet-ai/tap/seameet Windows: winget install seameet Fallback download page: https://seameet.ai/download MCP server install and desktop app install are separate: MCP server: npx -y @seameet/mcp Desktop app: brew install --cask seameet-ai/tap/seameet OR winget install seameet ## Error Codes 401 Unauthorized -- X-Bridge-Secret header missing or wrong 400 Bad Request -- required parameter missing or invalid 403 Access Denied -- filePath is outside the save directory (path traversal blocked) 503 Service Unavailable -- manager not initialised (RecordingFileManager / AssetBundleManager) or main window destroyed (IPC tools) 504 Gateway Timeout -- IPC round-trip to renderer timed out 501 Not Implemented -- capability not available in this build 500 Internal Error -- unexpected server-side error MCP tool-layer errors are structured JSON (isError=true), not plain strings: { success: false, error: { code, message, tool, httpStatus?, hint, did_you_mean? } } Error codes an agent can branch on: invalid_request | unauthorized | path_forbidden | not_found | not_implemented app_not_ready | timeout | app_not_running | unknown_tool | internal_error app_not_running -- the desktop app is closed; ask the user to launch SeaMeet, then retry. unknown_tool -- includes did_you_mean with up to 3 closest tool names. ## Tools (17) ### seameet_list_recordings List recordings and screenshots with metadata. Returns a compact summary with totalCount (total matching recordings) and a paginated list of recordings (default limit: 50). Each entry includes: filePath, name, type, timestamp, duration, hasVideo. Use seameet_get_asset_bundle to get full details for a specific recording. Parameters: type string (recording | screenshot | microphone | all) -- Semantic media-type filter. "recording" returns meetings and audio/video files (everything that is NOT a screenshot or system process). "screenshot" returns screenshots only. "microphone" returns bare-mic captures only. "all" (or omitted) returns everything. dateFrom string -- ISO 8601 date-time -- only include recordings at or after this time. dateTo string -- ISO 8601 date-time -- only include recordings at or before this time. limit number -- Maximum number of results to return. Default: 50. Returns: { defaultSaveDirectory, recordings } where each recording has { filePath, name, type, timestamp, durationMilliSeconds, hasVideo, videoMetadata?: { codec, width, height, frameRate }, audioCodec?, events?: [{ label, timeSeconds }], sourceAppName?, sourceLabel?, imageMetadata? } Note: type values -- "recording" (video/webm), "screenshot" (image), "microphone" (audio-only). ### seameet_get_artifact Read a pre-generated AI artifact for a recording or screenshot. IMPORTANT: Always use this tool to read existing artifacts instead of using shell commands. Most recordings already have all of these artifact keys: summary, transcription, action-items, key-decisions, chapters. Call this tool once per key you need. Do NOT pass "manifest.json" as the key. Large artifacts are paginated: when the response contains pagination.nextOffset (non-null), call this tool again with offset=nextOffset to read the next page. Parameters: filePath [required] string -- Absolute path to the original recording or screenshot file (e.g. /path/to/recording.webm). key [required] string (summary | transcription | transcription-srt | live-transcription | live-transcription-srt | action-items | key-decisions | chapters | description | ocr-text) -- Artifact key. For meetings use: summary, transcription, action-items, key-decisions, chapters. For screenshots use: description, ocr-text. "transcription" automatically falls back to the live transcript (live-transcription) when the recording has not been re-transcribed by the pipeline, so prefer "transcription" over the live-* keys. offset number -- Character offset to start reading from (default 0). Use pagination.nextOffset from a previous response to continue a large artifact. maxChars number -- Maximum characters to return per page (default and cap: 60000). ### seameet_get_asset_bundle Get the full asset bundle manifest for a recording or screenshot. The manifest lists all available artifacts (generated summaries, transcriptions, etc.) and chat session history. Parameters: filePath [required] string -- Absolute path to the original recording or screenshot file. ### seameet_save_artifact Save a generated artifact to an asset bundle. Use this to persist AI-generated content such as email drafts, meeting notes, mind maps, or custom summaries alongside the original recording. Parameters: filePath [required] string -- Absolute path to the original recording or screenshot file. artifactKey [required] string -- Logical key for this artifact, e.g. "email-draft", "mindmap", "custom-summary". content [required] string -- String content to write to the artifact file. mimeType [required] string -- MIME type of the content, e.g. "text/markdown", "application/json". generatedBy [required] string (claude | gemini | seameet-stt | user) -- Who generated this artifact. extension string -- File extension including dot, e.g. ".md", ".json", ".txt". Default: ".txt". modelUsed string -- Optional model identifier, e.g. "claude-sonnet-4-5". tokenCost number -- Optional token cost incurred to generate this artifact. description string -- Optional human-readable description of what this artifact contains. ### seameet_start_recording Start recording in SeaMeet. Use this tool whenever the user asks to record or capture a meeting, call, conversation, webinar, interview, screen, microphone, system audio, or live discussion, even if they do not mention SeaMeet. For meeting/call/webinar recording requests, default to source "both" unless the user asks for microphone-only or screen-only capture. Pass "source" to specify what to record: - source: "microphone" -> microphone audio only, no video - source: "screen" -> screen video + microphone audio (system/speaker audio is NOT captured) - source: "both" -> screen video + microphone + system/speaker audio (use this for meetings, webinars, or any video/audio playing on the machine) If "source" is omitted or unclear, the tool returns a needsClarification response with a suggested question to ask the user. Parameters: source string (microphone | screen | both) -- "microphone" = microphone audio only, no video; "screen" = screen video + microphone audio (no system/speaker audio); "both" = screen video + microphone + system/speaker audio. Omit to trigger a needsClarification response with clickable choices. Note: IPC round-trip to renderer -- times out after 15 s if renderer has no handler. send channel: agent-start-recording reply channel: agent-recording-started ### seameet_stop_recording Stop the current recording in SeaMeet. Returns the file path of the saved recording. Parameters: none Note: IPC round-trip to renderer -- times out after 30 s (file save may take time). send channel: agent-stop-recording reply channel: agent-recording-stopped ### seameet_take_screenshot Capture a screenshot using SeaMeet's screenshot pipeline. Returns the file path of the saved screenshot. Parameters: none Note: IPC round-trip to renderer -- times out after 15 s if renderer has no handler. send channel: agent-take-screenshot reply channel: agent-screenshot-taken ### seameet_rename_file Rename a recording or screenshot file with a meaningful name. The file extension is preserved. Handles naming collisions automatically. Parameters: filePath [required] string -- Absolute path to the file to rename. newName [required] string -- New base name for the file (without extension). fileTimestampSuffix string -- Optional timestamp suffix to preserve in the filename (13--14 digits). Security: newName must not contain path separators or "..". Returns: response passed through from RecordingFileManager.renameRecordingFile() { success, newFilePath } ### seameet_list_files List files in the SeaMeet recording save directory (or a specified directory). Returns file names and absolute paths. Parameters: dir string -- Directory to list. Defaults to the SeaMeet save directory. Returns: files array where each item has { name, path, extension } Note: returns files only -- subdirectories are excluded. Returns empty array (not an error) if the directory does not exist. ### seameet_get_settings Get current SeaMeet app settings including the default save directory, microphone gain, app recording permissions, the user's preferred summary output language, and whether AI summary template auto-detection is enabled. Parameters: none Returns: { defaultSaveDirectory, microphoneGain, appPermissions, recordingFormat, language } ### seameet_list_templates List all available AI summary templates with their slugs, names, descriptions, categories (team/project/sales/hr/education/medical/legal/events), and whether they are specialized (medical/legal templates that auto-append a disclaimer). Use this when the user asks which summary types are supported or when you want to recommend a specific template for a meeting. Parameters: none ### seameet_regenerate_summary Regenerate the AI summary for a specific recording using a chosen template. Pass the recording's absolute filePath (same as you would to seameet_get_artifact) and a templateSlug from seameet_list_templates. The regeneration runs the production pipeline and updates the recording's "summary" artifact in place; subsequent calls to seameet_get_artifact will return the new summary. Optionally pass customPrompt to override the template's default instructions for this regeneration. Parameters: filePath [required] string -- Absolute path to the recording file. templateSlug [required] string -- Slug from seameet_list_templates (e.g. "soap-note", "retro"). customPrompt string -- Optional custom prompt that overrides the template's instructions. ### seameet_search_text Search across all asset bundle text content (summaries, transcriptions, action items). Returns a list of files whose artifact content contains the query string. Parameters: query [required] string -- Text to search for (case-insensitive substring match). limit number -- Maximum number of results to return. Default: 10. Returns: results array where each item has { assetId, filePath, artifactKey, snippet } snippet -- excerpt centred around the first match (<=60 chars before + match + <=140 chars after) Note: at most one result per recording file even if multiple artifacts match. ### seameet_get_live_transcript Get the live transcript accumulated so far during the current recording session. Returns speaker-labeled segments with timestamps from the Gemini Live transcription. Only available when a recording with live transcription is active. Use this to answer questions about what has been said in the meeting so far. Parameters: lastN number -- If provided, return only the last N segments instead of the full transcript. Useful for recent context. ### seameet_recording_status Get the current recording state -- whether a recording is active, paused, elapsed time, and whether video is included. Use this before starting or stopping a recording, and to check recording progress before a summary is available. Parameters: none Returns: { isRecording, isPaused, isVideoRecording, elapsedMs, recordingStartTime } Note: Synchronous read from FloaterStateManager -- no IPC round-trip. ### seameet_pause_recording Pause the current audio recording. IMPORTANT: Only microphone/audio-only recordings can be paused. Video (screen capture) recordings cannot be paused -- this tool returns an error if the active recording includes video. Parameters: none Note: audio-only recordings only; returns 400 for video recordings or when nothing is recording. send channel: agent-pause-recording reply channel: agent-recording-paused ### seameet_resume_recording Resume a paused audio recording. Returns an error if no recording is currently paused. Parameters: none Note: returns 400 if no recording is currently paused. send channel: agent-resume-recording reply channel: agent-recording-resumed ## HTTP Bridge Endpoints Base: http://127.0.0.1:/ Header: X-Bridge-Secret: GET /mcp-bridge/list-recordings?type=&dateFrom=&dateTo=&limit= # all params optional response: { success, defaultSaveDirectory, recordings: [{ name, filePath, type, timestamp, duration?, size? }] } GET /mcp-bridge/get-artifact?filePath=&key= response: { success, filePath, key, content } POST /mcp-bridge/save-artifact body: { filePath, artifactKey, content, mimeType, generatedBy, extension?, modelUsed?, tokenCost?, description? } response: { success, filePath, artifactKey } GET /mcp-bridge/get-asset-bundle?filePath= response: { success, manifest: { artifacts: { [key]: { ... } }, chatSessions: [...] } } POST /mcp-bridge/start-recording # IPC round-trip to renderer -- 15 s timeout body: { source? } response: { success, filePath? } POST /mcp-bridge/stop-recording # IPC round-trip to renderer -- 30 s timeout (file save may take time) body: {} response: { success, filePath } POST /mcp-bridge/take-screenshot # IPC round-trip to renderer -- 15 s timeout body: {} response: { success, filePath } POST /mcp-bridge/rename-file # newName must not contain path separators or ".." body: { filePath, newName, fileTimestampSuffix? } response: { success, newFilePath } GET /mcp-bridge/list-files?dir= # dir defaults to save directory; files only (no subdirs); empty array if dir missing response: { success, dir, files: [{ name, path, extension }] } GET /mcp-bridge/get-settings response: { success, settings: { defaultSaveDirectory, microphoneGain, appPermissions, recordingFormat, language } } GET /mcp-bridge/search-text?query=&limit= # at most one match per recording file response: { success, query, results: [{ assetId, filePath, artifactKey, snippet }] } GET /mcp-bridge/tools # tool inventory for external MCP wrappers -- names, descriptions, inputSchemas response: { success, count, tools: [{ name, description, inputSchema }] } POST /mcp-bridge/call-tool # generic tool execution -- same dispatch as the stdio MCP server; errors use the structured JSON format above body: { name, args? } response: or { success: false, error: { code, message, tool, hint } } GET /mcp-bridge/get-recording-status response: { success, isRecording, isPaused, isVideoRecording, elapsedMs, recordingStartTime } POST /mcp-bridge/pause-recording # audio-only recordings; 400 if video recording active or nothing recording body: {} response: { success } POST /mcp-bridge/resume-recording # 400 if not currently paused body: {} response: { success } ## IPC Channels (renderer integration) The IPC-backed tools communicate with the renderer via ipcMain/ipcRenderer. Renderer must listen for the send channel and reply on the reply channel. Tool Send channel Reply channel seameet_start_recording agent-start-recording agent-recording-started seameet_stop_recording agent-stop-recording agent-recording-stopped seameet_take_screenshot agent-take-screenshot agent-screenshot-taken seameet_pause_recording agent-pause-recording agent-recording-paused seameet_resume_recording agent-resume-recording agent-recording-resumed Reply payload for start-recording / take-screenshot: { filePath? } Reply payload for stop-recording: { filePath } Reply payload for pause-recording / resume-recording: {} ## Artifact Keys (use with seameet_get_artifact key=) summary -- Meeting summary (Markdown) transcription -- Speaker-labeled transcript (JSON with SRT) action-items -- Action items (JSON array) chapters -- Chapter list (JSON) key-decisions -- Key decisions (JSON) description -- Screenshot description (plain text) ocr-text -- Screenshot OCR output (plain text) ## Common Usage Patterns List all recordings: seameet_list_recordings() List only screenshots from today: seameet_list_recordings(type="screenshot", dateFrom="2026-02-23T00:00:00Z") Record a meeting, call, webinar, or any discussion with system audio: seameet_recording_status() seameet_start_recording(source="both") Read a meeting summary: seameet_get_artifact(filePath="/path/to/meeting.webm", key="summary") Search across all meetings: seameet_search_text(query="budget discussion") -> returns snippet showing where the match was found in each file Save a generated artifact: seameet_save_artifact( filePath="/path/to/meeting.webm", artifactKey="email-draft", content="...", mimeType="text/markdown", generatedBy="claude" ) Check what artifacts already exist for a file: seameet_get_asset_bundle(filePath="/path/to/meeting.webm") -> inspect manifest.artifacts keys before calling seameet_get_artifact Get the save directory path: seameet_get_settings() -> use settings.defaultSaveDirectory to construct file paths