Call.md Documentation

repository·main·Indexed 19 days ago

https://github.com/video-db/call.md

Call.md is a desktop application for macOS that records meetings with real-time transcription and AI-powered insights using VideoDB and the Model Context Protocol (MCP) for tool integration. It features dual-channel transcription, a local-first SQLite database, and the ability to export meeting transcripts, summaries, and metrics into a structured Markdown format in the ~/.call_md/ directory.

Tokens
13.1K
Snippets
39
Records
57
Agent score
64%

What's inside Call.md

  1. Set up MCP servers in Call.md

    main

    Call.md supports the Model Context Protocol (MCP) to allow an AI agent to trigger tools automatically during meetings. To connect your own MCP servers:

    1. Navigate to Settings → MCP Servers within the application.
    2. Click Add Server.
    3. Select the appropriate transport type:
      • stdio: For local servers.
      • http: For remote servers.
    4. Configure the server details and click Connect.

    Once connected, the MCP agent will automatically detect information needs from the conversation and trigger relevant tools. Results will be displayed in the MCP Results panel during the meeting.

  2. Install Call.md on macOS

    main

    To install Call.md on macOS (supporting both Apple Silicon and Intel), run the following command in your terminal:

    curl -fsSL https://artifacts.videodb.io/call.md/install | bash

    Post-installation steps:

    1. Launch Call.md from your Applications folder or via Spotlight.
    2. Grant the required system permissions: Microphone and Screen Recording.
    3. Register the application using your VideoDB API key (available at console.videodb.io).
  3. Set up Call.md for development

    main

    Developers can run Call.md locally by following these steps:

    1. Clone the repository:
      git clone https://github.com/video-db/call.md.git
      cd call-md
    2. Install dependencies:
      npm install
    3. Rebuild native modules for Electron:
      npm run rebuild
    4. Start development mode:
      npm run dev
    5. Register: Enter your VideoDB API key when the application opens.

    Prerequisites:

    • Node.js 18+
    • npm 10+
    • macOS 12+ (Monterey or later)
    git clone https://github.com/video-db/call.md.git
    cd call-md
    npm install
    npm run rebuild
    npm run dev
  4. How the Tool Aggregator Service manages MCP tools

    main

    The ToolAggregatorService aggregates tools from all connected Model Context Protocol (MCP) servers. To prevent naming conflicts between different servers, it uses a namespacing pattern where tools are identified by the format serverId:toolName.

    This service provides several ways to interact with tools:

    • Namespaced Access: Using serverId:toolName to ensure you are calling the correct tool from a specific server.
    • Simple Name Access: Searching by the tool's base name (returns the first match).
    • Pattern/Keyword Search: Finding tools via regex patterns, keyword searches, or predefined intents (like crm, calendar, or docs).
    • Execution: Running tools via executeTool using their namespaced name.
    // Example of the namespacing concept
    // If server 'google-cal' has a tool 'create_event'
    // The namespacedName is 'google-cal:create_event'
  5. Render MCP Tool Results in the UI

    main

    The system transforms raw MCPToolResult data into MCPDisplayResult objects for UI rendering. This allows for consistent presentation of tool outputs.

    Display Types

    • cue-card: Small informational card.
    • panel: Side or bottom panel.
    • modal: Centered popup.
    • toast: Temporary notification.

    Content Formats (MCPDisplayContent)

    Results can be rendered using several formats:

    • text / markdown: For textual responses.
    • items: A list of key-value pairs with types like text, link, or badge.
    • table: Structured tabular data with headers and rows.
    • properties: A simple object of key-value pairs.
    • raw: Fallback for unformatted data.
    const displayResult: MCPDisplayResult = {
      id: 'disp-123',
      toolCallId: 'call-uuid-123',
      serverId: 'local-tool-01',
      serverName: 'Local Tool',
      toolName: 'get_weather',
      displayType: 'cue-card',
      title: 'Weather Update',
      timestamp: '2026-05-05T10:00:00Z',
      content: {
        items: [
          { label: 'Location', value: 'San Francisco', type: 'text' },
          { label: 'Temp', value: '72°F', type: 'badge' }
        ]
      }
    };
  6. How the Markdown export directory is structured

    main

    The Markdown export service organizes data into a time-based folder hierarchy within ~/.call_md/. This allows for easy chronological browsing and prevents filename collisions.

    Hierarchy:

    1. Root: ~/.call_md/ contains the index.md file.
    2. Meetings Root: ~/.call_md/meetings/
    3. Date Folders: Nested folders for Year/Month/Day.
    4. Meeting Folder: A sanitized version of the meetingName.

    Example Path: ~/.call_md/meetings/2024/03/24/project-sync/

  7. Copilot Event Subscriptions and Data Flow

    main

    The useCopilot hook automatically manages IPC event listeners via window.electronAPI.copilotOn. When these events are received, the hook updates the internal React state. You do not need to manually subscribe to these events if you are using the hook.

    Handled Events

    • onTranscript: Receives new transcript segments and adds them to the state.
    • onMetrics: Receives { metrics, health } updates to refresh real-time meeting data.
    • onNudge: Receives a { nudge } object when a new suggestion is available.
    • onCallEnded: Receives { summary, metrics, duration } to populate the post-meeting intelligence.
    • onError: Logs errors received from the copilot backend.
  8. Troubleshoot Call.md recording and transcription

    main

    Recording not starting

    • Verify that Microphone and Screen Recording permissions are granted in macOS System Settings > Privacy & Security.
    • Ensure your VideoDB API key is valid.

    Transcription not appearing

    • Confirm that both mic and system audio are enabled in the application settings.
    • Allow 5-10 seconds for the first transcripts to appear.
    • Check your internet connectivity (VideoDB features require an active connection).

    Development issues

    • Run npm run rebuild to fix native module issues.
    • Ensure you are using Node.js 18+.
    • Review application logs located at: ~/Library/Application Support/call-md/logs/.
  9. Configure Drizzle ORM for call-md

    main

    The project uses Drizzle ORM with a SQLite dialect. To configure the database connection and schema management, use defineConfig from drizzle-kit.

    Key configuration properties:

    • schema: The path to your TypeScript schema definition file.
    • out: The directory where Drizzle will output migrations.
    • dialect: Set to 'sqlite' for this project.
    • dbCredentials: An object containing connection details. For SQLite, use the url key to specify the path to the database file.
    import { defineConfig } from 'drizzle-kit';
    
    export default defineConfig({
      schema: './src/main/db/schema.ts',
      out: './drizzle',
      dialect: 'sqlite',
      dbCredentials: {
        url: './data/call-md.db',
      },
    });
  10. Configure an MCP Server

    main

    To connect to a Model Context Protocol (MCP) server, you must provide an MCPServerConfig object. The configuration depends on the chosen transport type.

    Stdio Transport

    Used for local processes. Requires a command and optional args or env variables.

    HTTP/SSE Transport

    Used for remote services. Requires a url and optional headers.

    Common Configuration Fields

    • id: Unique identifier for the server.
    • name: Human-readable name.
    • isEnabled: Boolean to toggle the server.
    • autoConnect: Boolean to determine if the connection should be established automatically.
    // Example: Local stdio server
    const localServer: MCPServerConfig = {
      id: 'local-tool-01',
      name: 'Local Python Tool',
      transport: 'stdio',
      command: 'python3',
      args: ['/path/to/tool.py'],
      env: { 'API_KEY': 'secret-value' },
      isEnabled: true,
      autoConnect: true,
      connectionStatus: 'disconnected',
      createdAt: '2026-05-05T00:00:00Z',
      updatedAt: '2026-05-05T00:00:00Z'
    };
    
    // Example: Remote HTTP server
    const remoteServer: MCPServerConfig = {
      id: 'remote-api-01',
      name: 'Cloud Service',
      transport: 'http',
      url: 'https://api.example.com/mcp',
      headers: { 'Authorization': 'Bearer token' },
      isEnabled: true,
      autoConnect: true,
      connectionStatus: 'disconnected',
      createdAt: '2026-05-05T00:00:00Z',
      updatedAt: '2026-05-05T00:00:00Z'
    };
  11. Reference: Data storage locations

    main

    Call.md uses a local-first approach with a SQLite database. Data is stored at:

    • Database: ~/Library/Application Support/call-md/data/call-md.db
    • Logs: ~/Library/Application Support/call-md/logs/app-YYYY-MM-DD.log