@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
Maintainers
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 buildConfiguration
Environment Variables
The MCP server requires the following environment variables:
FIREBASE_SERVICE_ACCOUNT_PATH(required): Absolute path to your Firebase service account JSON fileFIREBASE_DATABASE_ID(optional): Firestore database ID (defaults totb-meeting-notes)
Getting a Firebase Service Account
- Go to Firebase Console
- Select your project
- Go to Project Settings > Service Accounts
- Click "Generate New Private Key"
- Save the JSON file securely (never commit to git!)
- 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 referencesactionItems: Action items linked to meetingspeople: Internal team members/employeesclient-contacts: External client contactsclients: Client organizationsprojects: 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 nameslimit(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 PIDsclientId(optional): Filter results to projects belonging to a specific clientlimit(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 titlecontent(required): Full transcript or summary textcontentType(required): "transcript" or "summary"meetingDate(required): ISO format date (YYYY-MM-DDTHH:mm:ss)meetingType(required): "internal", "client", or "external"duration(optional): Duration in minutesattendees(required): Array of attendee objects with name, email, role, organizationIdstakeholders(optional): Array of non-attending stakeholder objectsclientIds(optional): Array of related client IDsprojectIds(optional): Array of related project IDsactionItems(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 paginationmeetingType(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 IDtitle(optional): New titlesummary(optional): Updated summarymetadata(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 descriptionassigneeEmails(required): Array of assignee email addressesdueDate(optional): ISO format due datemeetingId(optional): ID of originating meeting
update_action_item
Update an existing action item.
Parameters:
actionItemId(required): Action item IDstatus(optional): "open", "in-progress", "completed", or "cancelled"action(optional): Updated descriptionassigneeEmails(optional): Updated assignee emailsdueDate(optional): Updated due date
list_action_items
List action items with optional filtering.
Parameters:
status(optional): Filter by statusassigneeEmail(optional): Filter by assignee emailmeetingId(optional): Filter by meeting IDlimit(optional): Max number of items (default: 20)
How It Works
Attendee/Stakeholder Lookup Flow
- When saving a meeting, the server extracts all attendees and stakeholders
- For each person, it searches:
- First in the
peoplecollection (internal team members) - Then in the
client-contactscollection (external contacts)
- First in the
- If a contact is not found:
- It's marked for creation
- A new record is created in
client-contactswith type "external" - The contact is linked via Firestore reference
- 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 watchUsage 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:
- Save the file
- Completely quit Claude Desktop (not just close the window)
- Restart Claude Desktop
- The MCP server should appear in the available tools
Troubleshooting
Test Firebase Connection
Run the test script to verify Firebase connectivity:
node test-connection.jsYou 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
Server shuts down immediately
- Verify the path to
index.jsis correct in the config - Ensure the build directory exists:
npm run build - Check that Node.js is in your PATH
- Verify the path to
Firebase connection errors
- Verify the service account JSON file exists in
keys/directory - Ensure the database name
tb-meeting-notesis correct - Check Firebase permissions for the service account
- Verify the service account JSON file exists in
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
