# SeaMeet MCP Server -- LLM Reference # Generated: 2026-07-07T23:33:51.595Z # # 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. ## 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. 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 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") 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