spark-mcp
Enables users to access, search, and analyze Spark Desktop meeting transcripts and emails through natural language via the Model Context Protocol.
README
Spark MCP Server
MCP server for accessing Spark Desktop meeting transcripts and emails through the Model Context Protocol.
Features
- 📝 Access all meeting transcripts (calendar-based and ad-hoc)
- 🔍 Full-text search across transcript content
- 📊 Statistics and analytics about your transcripts
- 🔒 Read-only access - safe and non-destructive
- ⚡ Fast local SQLite queries - no network required
- 🎯 Captures ad-hoc meetings (primary use case)
Requirements
- macOS (Spark Desktop must be installed)
- Python 3.10+
- Spark Desktop for macOS (App Store version)
Installation
# Install in development mode
pip install -e .
Usage
With Claude Desktop
Add to your Claude Desktop MCP settings (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"spark": {
"command": "python",
"args": ["-m", "spark_mcp.server"],
"cwd": "/Users/feamster/src/spark-mcp"
}
}
}
Or if installed via pip:
{
"mcpServers": {
"spark": {
"command": "spark-mcp"
}
}
}
Restart Claude Desktop, and the tools will be available.
Standalone Testing
# Run the server (communicates via stdio)
python -m spark_mcp.server
Available Tools
1. list_meeting_transcripts
List meeting transcripts with metadata.
Parameters:
limit(optional, default: 20): Max resultsafter(optional): Return transcripts with meetingStartDate after this ISO datetime (e.g., '2026-01-30T13:00:00')before(optional): Return transcripts with meetingStartDate before this ISO datetime (e.g., '2026-01-30T16:00:00')
Example:
{
"after": "2026-02-09T09:00:00",
"before": "2026-02-09T12:00:00",
"limit": 10
}
Returns:
{
"transcripts": [
{
"messagePk": 63336,
"subject": "Prior Art Review for Patent Claims 416 and 571",
"sender": "example@example.com",
"receivedDate": "2025-11-11 15:59:12",
"meetingStartDate": "2025-11-11T15:00:00.000Z",
"meetingEndDate": "2025-11-11T16:00:00.000Z",
"transcriptId": "-8929133086933914113",
"isCalendarEvent": false,
"eventSummary": null,
"textLength": 29893,
"hasFullText": true
}
],
"total": 228
}
2. get_meeting_transcript
Get full transcript content.
Parameters:
messagePk(optional): Message primary key from listtranscriptId(optional): Transcript ID (mtid)
Example:
{
"messagePk": 63336
}
Returns:
{
"messagePk": 63336,
"subject": "Prior Art Review for Patent Claims 416 and 571",
"sender": "example@example.com",
"recipients": "recipient@example.com",
"receivedDate": "2025-11-11 15:59:12",
"meetingStartDate": "2025-11-11T15:00:00.000Z",
"meetingEndDate": "2025-11-11T16:00:00.000Z",
"transcriptId": "-8929133086933914113",
"fullText": "the meeting focused on reviewing prior art for patent claims...",
"metadata": {
"language": "auto",
"status": true,
"autoProcessed": true,
"isKept": true,
"eventSummary": null
}
}
3. search_meeting_transcripts
Full-text search across transcripts.
Parameters:
query(required): Search query (FTS5 syntax supported)startDate(optional): Filter after this dateendDate(optional): Filter before this datelimit(optional, default: 20): Max resultsincludeContext(optional, default: true): Include highlighted excerpts
Example:
{
"query": "neural network AND security",
"limit": 5
}
FTS5 Query Syntax:
word1 AND word2- Both words must be presentword1 OR word2- Either word presentNOT word- Exclude word"exact phrase"- Exact phrase matchword*- Prefix match
Returns:
{
"results": [
{
"messagePk": 62642,
"subject": "Meeting Summary",
"sender": "example@example.com",
"receivedDate": "2025-11-10 23:04:38",
"excerpt": "...discussing <mark>neural network</mark> architectures for <mark>security</mark> applications...",
"relevanceScore": 1.5
}
],
"total": 5
}
4. get_transcript_statistics
Get overview statistics.
Parameters: None
Returns:
{
"totalTranscripts": 233,
"calendarMeetings": 37,
"adHocMeetings": 196,
"keptTranscripts": 228,
"deletedTranscripts": 5,
"withFullText": 225,
"dateRange": {
"earliest": "2024-09-01 10:00:00",
"latest": "2025-11-11 15:59:12"
},
"topSenders": [
{
"email": "colleague@example.com",
"count": 45
}
]
}
Data Sources
Databases Used
-
messages.sqlite- Transcript metadata- Location:
~/Library/Containers/com.readdle.SparkDesktop.appstore/Data/Library/Application Support/Spark Desktop/core-data/messages.sqlite - Tables:
messages,meetTranscriptEvent - Size: ~178 MB
- Location:
-
search_fts5.sqlite- Full transcript text- Location:
~/Library/Containers/com.readdle.SparkDesktop.appstore/Data/Library/Application Support/Spark Desktop/core-data/search_fts5.sqlite - Table:
messagesfts(FTS5 full-text index) - Size: ~232 MB
- Location:
Transcript Types
Calendar-Based Meetings (37 transcripts):
- Scheduled meetings with calendar event info
- Stored in
meetTranscriptEventtable - Have
eventSummaryfield
Ad-Hoc Meetings (196 transcripts):
- User-initiated transcriptions
- Not linked to calendar events
- This is the primary use case for most users
Total: 228 kept transcripts (233 including deleted)
Safety Features
- ✅ Read-only database access
- ✅ No writes or modifications
- ✅ Graceful handling of schema changes
- ✅ Safe concurrent access with Spark
Troubleshooting
"Failed to connect to Spark databases"
- Verify Spark Desktop is installed (App Store version)
- Check database paths exist:
ls -la ~/Library/Containers/com.readdle.SparkDesktop.appstore/Data/Library/Application\ Support/Spark\ Desktop/core-data/
No transcripts found
- Make sure you have meeting transcripts in Spark
- Check that transcripts are marked as "kept" (not deleted)
- Try running
get_transcript_statisticsto see counts
Empty transcript text
Some transcripts may not have full text cached locally:
- Recent transcripts may still be syncing
- Deleted transcripts have no content
- Check
hasFullTextfield in list results
Development
# Install in development mode
pip install -e .
# Run tests (if you add them)
pytest
Future Enhancements
See PLAN.md for detailed roadmap, including:
- General email search and processing
- Alternative data access methods (API, IMAP)
- Additional analytics and insights
- Export capabilities
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.