mcp-granola
mcp-granola
Granola 회의 노트에 AI 에이전트가 액세스할 수 있도록 지원하는 MCP (Model Context Protocol) 서버입니다. 노트를 검색하고, AI 요약 및 녹취록을 포함한 전체 내용을 가져오며, 회의 기록을 페이지 단위로 탐색할 수 있습니다.
주요 기능
노트 목록 조회: 날짜 필터링 및 커서 기반 페이지네이션 지원
전체 노트 내용 가져오기: AI 요약 및 회의 녹취록 포함
노트 검색: 제목 또는 요약 키워드로 검색
호환성: Claude Code, Gemini CLI 및 모든 MCP 호환 클라이언트와 작동
의존성: MCP SDK 외 외부 의존성 없음
Related MCP server: Bruin
빠른 시작
1. 설치
npm install @devli13/mcp-granola또는 로컬에서 복제 및 설치:
git clone https://github.com/devli13/mcp-granola.git
cd mcp-granola
npm install2. Granola API 키 발급
Granola 데스크톱 앱을 엽니다.
Settings > API로 이동합니다.
Create new key를 클릭합니다.
키를 복사합니다 (
grn_으로 시작).
3. 설정
.mcp.json (Claude Code) 또는 .gemini/settings.json (Gemini CLI)에 추가합니다:
{
"mcpServers": {
"granola": {
"command": "npx",
"args": ["-y", "@devli13/mcp-granola"],
"env": {
"GRANOLA_API_KEY": "grn_your_api_key_here"
}
}
}
}또는 직접 실행:
GRANOLA_API_KEY=grn_your_key node server.js구성
환경 변수 | 필수 여부 | 설명 |
| 예 | Granola API 키 ( |
도구
도구 | 설명 | 주요 매개변수 |
| 노트 목록 조회 (최신순) |
|
| ID로 단일 노트 가져오기 |
|
| 제목/요약 키워드로 노트 검색 |
|
예시: 최근 노트 목록 조회
{
"name": "list_notes",
"arguments": {
"limit": 5,
"created_after": "2025-01-01T00:00:00Z"
}
}예시: 녹취록을 포함한 노트 가져오기
{
"name": "get_note",
"arguments": {
"id": "not_abc123def456",
"include_transcript": true
}
}제한 사항
Granola API는 베타 버전입니다 — 엔드포인트 및 응답 형식이 변경될 수 있습니다.
개인 API 키는 본인 소유이거나 직접 공유받은 노트에만 액세스할 수 있습니다.
**
search_notes**는 가장 최근 노트 200개를 대상으로 클라이언트 측에서 부분 문자열 일치 검색을 수행합니다. 전체 텍스트 검색 엔진이 아닙니다. 노트 양이 많을 경우 날짜 필터를 사용하여list_notes를 사용하세요.API는 AI 요약 및 녹취록이 생성된 노트만 반환합니다. 처리 중인 노트는 나타나지 않습니다.
속도 제한
Granola는 워크스페이스별로 속도 제한을 적용합니다:
지표 | 값 |
버스트 용량 | 25회 요청 |
시간 창 | 5초 |
지속 속도 | 5 req/s (분당 300회) |
기여
이슈 및 풀 리퀘스트는 언제나 환영합니다! 중요한 변경 사항을 논의하려면 먼저 이슈를 열어주세요.
라이선스
MIT
Available Tools
3 toolsget_noteA
Fetch a Granola note by ID. Pass include="transcript" to also return the transcript.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Note ID, like not_XXXXXXXXXXXXXX. | |
| include_transcript | No | Include the meeting transcript. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions fetching a note and including a transcript, but does not disclose other behavioral traits such as error handling (e.g., what happens if the ID is invalid), authentication needs, rate limits, or whether it's a read-only operation. This leaves significant gaps for an agent to understand how to use it safely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero waste, front-loaded with the core purpose and followed by a specific usage tip. Every sentence earns its place by adding actionable information, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 parameters, no output schema, no annotations), the description is adequate but incomplete. It covers the basic purpose and a parameter tip, but lacks details on behavioral aspects like error handling or return values, which are important for a tool with no annotations or output schema. It's minimally viable but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the schema already documents both parameters (id and include_transcript) with descriptions. The description adds minimal value by mentioning the include parameter's purpose ('to also return the transcript'), but does not provide additional syntax or format details beyond what the schema provides. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Fetch') and resource ('a Granola note by ID'), distinguishing it from sibling tools like 'list_notes' (which lists multiple notes) and 'search_notes' (which searches notes). It precisely defines what the tool does without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (to fetch a specific note by ID) and includes an optional feature (include transcript), but it does not explicitly state when not to use it or name alternatives like 'list_notes' or 'search_notes'. This gives good guidance but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesA
List Granola notes, most-recent first. Supports created_after/created_before ISO timestamps and a cursor for pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max notes per page (default 20, max 100). | |
| created_after | No | ISO-8601 timestamp; only notes created strictly after this. | |
| created_before | No | ISO-8601 timestamp; only notes created strictly before this. | |
| cursor | No | Pagination cursor from previous response.hasMore. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses ordering behavior ('most-recent first'), filtering capabilities, and pagination support, but lacks details on rate limits, authentication needs, error handling, or response format, which are important for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that efficiently conveys purpose, ordering, and key features (filtering and pagination) without any wasted words, making it easy to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description covers basic functionality but lacks details on response structure (e.g., what fields are returned), error cases, or advanced usage scenarios, leaving gaps for an AI agent to fully understand tool behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds context by mentioning ISO timestamps and cursor usage, but does not provide additional meaning beyond what the schema specifies, such as default values or constraints not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), resource ('Granola notes'), and ordering ('most-recent first'), which is specific and distinguishes it from sibling tools like get_note (single note) and search_notes (likely keyword-based).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving multiple notes with time-based filtering and pagination, but does not explicitly state when to use this tool versus alternatives like search_notes, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesA
Client-side substring search over the list_notes response (title + summary). Pages up to 200 most recent notes then filters.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Case-insensitive substring to match on title/summary. | |
| limit | No | Max matches returned (default 10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and discloses important behavioral traits: it's a client-side filter (not server-side search), operates on cached list_notes response, has a 200-note limit, returns up to limit matches, and performs case-insensitive substring matching. However, it doesn't mention performance characteristics or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise - one sentence that packs essential information about scope, method, and limitations. Every word earns its place with zero waste, and it's front-loaded with the core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no annotations and no output schema, the description does well by explaining the client-side nature, 200-note limit, and substring matching. However, it doesn't describe the return format (what fields are included) or what happens when no matches are found, which would be helpful given the lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters. The description adds marginal value by mentioning the search operates on 'title + summary' and the 200-note context, but doesn't provide additional syntax or format details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('client-side substring search') and resource ('list_notes response') with precise scope ('title + summary'). It explicitly distinguishes from sibling tools by mentioning it operates on list_notes response rather than direct database access, unlike get_note or list_notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about when to use this tool ('client-side substring search over the list_notes response') and mentions the 200-note limit, but doesn't explicitly state when NOT to use it or name alternatives. It implies usage for substring matching rather than exact or structured queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v0.1.0- First observed
get_note - First observed
list_notes - First observed
search_notes
TDQS
Each tool has a clearly distinct purpose: get_note retrieves a single note by ID, list_notes lists notes with filtering and pagination, and search_notes performs substring searches over note content. There is no overlap in functionality, making tool selection straightforward for an agent.
All tool names follow a consistent verb_noun pattern (get_note, list_notes, search_notes) with clear, descriptive verbs. The naming is uniform and predictable, enhancing usability and reducing confusion.
With only 3 tools, the server feels thin for a note management domain, as it lacks essential CRUD operations like create, update, or delete. While the tools are well-defined, the count is borderline low for comprehensive functionality.
The tool surface is significantly incomplete for note management, covering only read and search operations. There are no tools for creating, updating, or deleting notes, which are critical for a full lifecycle, leading to potential agent failures in workflows requiring modification.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
An MCP server that provides tools to discover and retrieve podcast episodes transcripts.
Related MCP Servers
- AlicenseAqualityDmaintenanceIntegrates Granola.ai meeting intelligence with MCP clients to provide direct access to meeting notes, transcripts, and workspace organization. It allows users to search and retrieve meeting content through natural language by leveraging existing Granola credentials.74MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.62MIT
- AlicenseNot gradedqualityCmaintenanceA self-hosted MCP server for storing, searching, and querying meeting notes with semantic search and RAG capabilities using SQLite + OpenRouter.20MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes local Granola meeting notes, summaries, and transcripts to AI assistants via SQLite-backed search and retrieval.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/devli13/mcp-granola'
If you have feedback or need assistance with the MCP directory API, please join our Discord server