只读的MCP服务器,通过MCP工具公开Granola会议。支持本地文件缓存和远程API源。
pip install -e .[dev,mcp]
granola-mcp
export GRANOLA_CACHE_PATH="~/Library/Application Support/Granola/cache-v3.json"
export GRANOLA_STDLIB_ONLY=true
export GRANOLA_USE_SQLITE=false
在5分钟内启动远程模式!
访问 Granola设置 并复制您的API Token。
在项目根目录创建一个.env文件:
# 启用远程模式
GRANOLA_DOCUMENT_SOURCE=remote
# 添加您的Token
GRANOLA_API_TOKEN=your_actual_token_here
# 可选:自定义缓存(显示默认值)
# GRANOLA_CACHE_TTL_SECONDS=86400 # 24小时
# GRANOLA_CACHE_DIR=~/.granola/remote_cache
或者导出环境变量:
export GRANOLA_DOCUMENT_SOURCE=remote
export GRANOLA_API_TOKEN=your_token_here
granola-mcp
使用示例脚本:
python examples/remote_source_example.py
使用MCP Inspector:
npx @modelcontextprotocol/inspector
然后测试 granola.meetings.list 工具。
检查缓存状态:
使用 granola.cache.status 工具验证远程模式是否激活。
# 远程模式并自定义缓存TTL(1小时)
export GRANOLA_DOCUMENT_SOURCE=remote
export GRANOLA_API_TOKEN=your_token
export GRANOLA_CACHE_TTL_SECONDS=3600
granola-mcp
错误:"需要API Token"
→ 设置 GRANOLA_API_TOKEN 环境变量
错误:"无效或已过期的Token"
→ 从 Granola设置 获取新的Token
文档未更新
→ 调用 granola.cache.refresh 工具或等待缓存TTL到期
📖 参阅 REMOTE_SOURCE_GUIDE.md 以获取全面的部署场景、安全性和高级配置文档。
MCP Inspector 是一个可视化测试工具,提供了一个基于Web的界面来与MCP服务器交互。它非常适合测试和调试您的Granola MCP服务器。
npx @modelcontextprotocol/inspector
启动您的Granola MCP服务器:
granola-mcp
启动Inspector:
npx @modelcontextprotocol/inspector
配置连接:
granola-mcp您可以创建一个配置文件以便于设置:
{
"mcpServers": {
"granola": {
"command": "granola-mcp",
"args": [],
"env": {
"GRANOLA_CACHE_PATH": "~/Library/Application Support/Granola/cache-v3.json",
"GRANOLA_STDLIB_ONLY": "true",
"GRANOLA_USE_SQLITE": "false"
}
}
}
}
然后运行:
npx @modelcontextprotocol/inspector --config path/to/config.json --server granola
更多信息,请访问 MCP Inspector仓库。
列出会议,可选过滤和分页。
输入参数:
{
"q": "搜索查询字符串",
"from_ts": "2024-01-01T00:00:00Z",
"to_ts": "2024-12-31T23:59:59Z",
"participants": ["John Doe", "Jane Smith"],
"limit": 50,
"cursor": "分页游标字符串"
}
参数详情:
q(可选):搜索查询字符串from_ts(可选):ISO 8601时间戳,用于下界过滤to_ts(可选):ISO 8601时间戳,用于上界过滤participants(可选):按参与者名称过滤的列表limit(可选):返回的结果数量(1-500,默认:50)cursor(可选):分页游标,用于下一页返回值: 包含可选下一页游标的会议概要列表
获取特定会议的详细信息。
输入参数:
{
"id": "会议标识符123",
"include": ["笔记", "元数据"]
}
参数详情:
id(必需):会议标识符include(可选):要包含的字段列表(如["笔记", "元数据"])返回值: 包含笔记、概述、总结和元数据的完整会议记录
通过文本查询和高级过滤搜索会议。
输入参数:
{
"q": "搜索查询字符串",
"filters": {
"participants": ["John Doe", "Jane Smith"],
"platform": "zoom",
"before": "2024-12-31T23:59:59Z",
"after": "2024-01-01T00:00:00Z"
},
"limit": 50,
"cursor": "分页游标字符串"
}
参数详情:
q(必需):搜索查询字符串filters(可选):高级过滤器对象,包含:
participants(可选):参与者名称列表platform(可选):平台过滤器(如"zoom", "meet", "teams", "其他")before(可选):ISO 8601时间戳,用于上界after(可选):ISO 8601时间戳,用于下界limit(可选):结果数量(1-500,默认:50)cursor(可选):分页游标返回值: 包含分页的匹配会议概要列表
将会议导出为Markdown格式。
输入参数:
{
"id": "会议标识符123",
"sections": ["标题", "笔记", "参会者", "链接"]
}
参数详情:
id(必需):会议标识符sections(可选):要包含的部分列表(如["标题", "笔记", "参会者", "链接"])返回值: Markdown格式的会议内容
获取会议统计和分析。
输入参数:
{
"window": "30d",
"group_by": "day"
}
参数详情:
window(可选):时间窗口(如"7d", "30d", "90d")group_by(可选):分组周期(如"day", "week")返回值: 统计包括按周期的会议数量和参与者数据
获取关于缓存的信息(本地或远程)。
输入参数:
{}
返回值: 缓存信息,包括路径、大小、最后加载的时间戳和配置文件类型
手动刷新缓存,绕过TTL(适用于远程模式)。
输入参数:
{}
返回值: 刷新状态、消息、会议数量和缓存信息
运行测试:
pytest -q
格式化:
black . && isort .