npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@unboundai/meeting-notes-mcp

v1.7.1

Published

MCP server for managing meeting notes, attendees, and action items in Firebase/Firestore with smart attendee lookup and auto-creation

Readme

Meeting Notes MCP Server

A Model Context Protocol (MCP) server for managing meeting notes, attendees, action items, and stakeholders in Firebase/Firestore.

Features

  • Meeting Management: Create, read, update, and delete meetings with full transcript or summary support
  • Smart Attendee Lookup: Automatically looks up internal team members and external contacts
  • Auto-create External Contacts: Creates new contact records for external attendees not in the database
  • Action Items: Track and manage action items linked to meetings
  • Stakeholder Tracking: Maintain references to both attending and non-attending stakeholders
  • Client & Project Linking: Associate meetings with clients and projects
  • Flexible Filtering: Search and filter meetings by type, client, date, and more

Installation

npm install
npm run build

Configuration

Environment Variables

The MCP server requires the following environment variables:

  • FIREBASE_SERVICE_ACCOUNT_PATH (required): Absolute path to your Firebase service account JSON file
  • FIREBASE_DATABASE_ID (optional): Firestore database ID (defaults to tb-meeting-notes)

Getting a Firebase Service Account

  1. Go to Firebase Console
  2. Select your project
  3. Go to Project Settings > Service Accounts
  4. Click "Generate New Private Key"
  5. Save the JSON file securely (never commit to git!)
  6. Set the path to this file in your MCP configuration

Firebase Collections

The server interacts with the following Firestore collections:

  • meetings: Meeting documents with metadata, transcripts, summaries, and references
  • actionItems: Action items linked to meetings
  • people: Internal team members/employees
  • client-contacts: External client contacts
  • clients: Client organizations
  • projects: Project records

Available Tools

lookup_clients

Search for clients by name or keyword. Returns matching clients with their details. Use this before saving a meeting to find the correct client ID(s).

Parameters:

  • searchTerm (required): Name or keyword to search for in client names
  • limit (optional): Maximum number of results (default: 10)

Example:

{
  "searchTerm": "Traffic Builders"
}

Returns: Array of matching clients with id, name, type, totalProjects, and entities.

lookup_projects

Search for projects by name, client name, or project ID (PID). Optionally filter by client. Returns matching projects with their details. Use this before saving a meeting to find the correct project ID(s).

Parameters:

  • searchTerm (required): Name or keyword to search for in project names, client names, or PIDs
  • clientId (optional): Filter results to projects belonging to a specific client
  • limit (optional): Maximum number of results (default: 10)

Example:

{
  "searchTerm": "SEA campagnes",
  "clientId": "CL1GWH5VBJ863NP"
}

Returns: Array of matching projects with id, pid, name, client, clientId, state, dates, and PM.

save_meeting

Save a new meeting with transcript or summary. Automatically looks up attendees/stakeholders and creates new external contacts if needed. Use lookup_clients and lookup_projects first to find the correct IDs.

Parameters:

  • title (required): Meeting title
  • content (required): Full transcript or summary text
  • contentType (required): "transcript" or "summary"
  • meetingDate (required): ISO format date (YYYY-MM-DDTHH:mm:ss)
  • meetingType (required): "internal", "client", or "external"
  • duration (optional): Duration in minutes
  • attendees (required): Array of attendee objects with name, email, role, organizationId
  • stakeholders (optional): Array of non-attending stakeholder objects
  • clientIds (optional): Array of related client IDs
  • projectIds (optional): Array of related project IDs
  • actionItems (optional): Array of action items with action, assigneeEmails, dueDate

Example:

{
  "title": "Q1 Strategy Meeting",
  "content": "Full meeting transcript here...",
  "contentType": "transcript",
  "meetingDate": "2025-01-15T14:00:00",
  "meetingType": "client",
  "duration": 60,
  "attendees": [
    {
      "name": "John Doe",
      "email": "[email protected]",
      "role": "Project Manager"
    },
    {
      "name": "Jane Smith",
      "email": "[email protected]",
      "role": "CEO",
      "organizationId": "client-org-123"
    }
  ],
  "actionItems": [
    {
      "action": "Prepare Q1 report",
      "assigneeEmails": ["[email protected]"],
      "dueDate": "2025-01-22T17:00:00"
    }
  ]
}

list_meetings

List meetings with optional filtering and pagination.

Parameters:

  • limit (optional): Max number of meetings (default: 10)
  • startAfter (optional): Meeting ID for pagination
  • meetingType (optional): Filter by "internal", "client", or "external"
  • clientId (optional): Filter by client ID

get_meeting

Get full details of a specific meeting including transcript, attendees, and action items.

Parameters:

  • meetingId (required): Meeting ID

update_meeting

Update meeting details.

Parameters:

  • meetingId (required): Meeting ID
  • title (optional): New title
  • summary (optional): Updated summary
  • metadata (optional): Updated metadata object

delete_meeting

Delete a meeting.

Parameters:

  • meetingId (required): Meeting ID

create_action_item

Create a new action item, optionally linked to a meeting.

Parameters:

  • action (required): Action item description
  • assigneeEmails (required): Array of assignee email addresses
  • dueDate (optional): ISO format due date
  • meetingId (optional): ID of originating meeting

update_action_item

Update an existing action item.

Parameters:

  • actionItemId (required): Action item ID
  • status (optional): "open", "in-progress", "completed", or "cancelled"
  • action (optional): Updated description
  • assigneeEmails (optional): Updated assignee emails
  • dueDate (optional): Updated due date

list_action_items

List action items with optional filtering.

Parameters:

  • status (optional): Filter by status
  • assigneeEmail (optional): Filter by assignee email
  • meetingId (optional): Filter by meeting ID
  • limit (optional): Max number of items (default: 20)

How It Works

Attendee/Stakeholder Lookup Flow

  1. When saving a meeting, the server extracts all attendees and stakeholders
  2. For each person, it searches:
    • First in the people collection (internal team members)
    • Then in the client-contacts collection (external contacts)
  3. If a contact is not found:
    • It's marked for creation
    • A new record is created in client-contacts with type "external"
    • The contact is linked via Firestore reference
  4. All attendees and stakeholders are stored as Firestore document references

Meeting Document Structure

{
  id: string,
  title: string,
  fullTranscript: string,
  summary: string,
  attendees: DocumentReference[], // refs to people or client-contacts
  stakeholders: DocumentReference[], // refs to people or client-contacts
  clients: DocumentReference[], // refs to clients
  projects: DocumentReference[], // refs to projects
  actionItems: DocumentReference[], // refs to actionItems
  metadata: {
    meetingType: "internal" | "client" | "external",
    duration: number,
    meetingDate: Timestamp
  },
  createdAt: Timestamp,
  updatedAt: Timestamp
}

Development

# Build
npm run build

# Watch mode
npm run watch

Usage with Claude Desktop

Add to your Claude Desktop MCP configuration file:

Windows: %APPDATA%\Claude\claude_desktop_config.json macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Development (Local)

{
  "mcpServers": {
    "meeting-notes": {
      "command": "node",
      "args": [
        "C:\\path\\to\\meeting-notes-mcp\\build\\index.js"
      ],
      "env": {
        "FIREBASE_SERVICE_ACCOUNT_PATH": "C:\\path\\to\\your\\firebase-service-account.json",
        "FIREBASE_DATABASE_ID": "tb-meeting-notes"
      }
    }
  }
}

Using npm Package

{
  "mcpServers": {
    "meeting-notes": {
      "command": "npx",
      "args": [
        "-y",
        "@trafficbuilders/meeting-notes-mcp"
      ],
      "env": {
        "FIREBASE_SERVICE_ACCOUNT_PATH": "/path/to/your/firebase-service-account.json",
        "FIREBASE_DATABASE_ID": "your-database-id"
      }
    }
  }
}

Note: Replace the paths with your actual file locations. On Windows, use double backslashes (\\) in JSON strings.

After adding the configuration:

  1. Save the file
  2. Completely quit Claude Desktop (not just close the window)
  3. Restart Claude Desktop
  4. The MCP server should appear in the available tools

Troubleshooting

Test Firebase Connection

Run the test script to verify Firebase connectivity:

node test-connection.js

You should see: ✅ Successfully connected! Found 11 collections

Check MCP Server Logs

Claude Desktop logs are located at:

  • Windows: %APPDATA%\Claude\logs\
  • macOS: ~/Library/Logs/Claude/

Look for error messages from the meeting-notes server.

Common Issues

  1. Server shuts down immediately

    • Verify the path to index.js is correct in the config
    • Ensure the build directory exists: npm run build
    • Check that Node.js is in your PATH
  2. Firebase connection errors

    • Verify the service account JSON file exists in keys/ directory
    • Ensure the database name tb-meeting-notes is correct
    • Check Firebase permissions for the service account
  3. Server not appearing in Claude

    • Make sure you fully quit Claude Desktop before restarting
    • Verify JSON configuration syntax is valid
    • Check Claude Desktop logs for parsing errors

License

ISC