feat: vendor granola-engineer Cursor plugin - #18
donny-devops wants to merge 3 commits into
Conversation
Add the Granola plugin at .cursor/plugins/granola/ with the granola-engineer agent, context/prep/review skills, six slash commands, always-on meeting-context rule, and Granola MCP. Co-authored-by: Adonis Jimenez <donny-devops@users.noreply.github.com>
ECC Tools / Security EvidenceCommit: Security scanner evidence required (action_required) Detected 1 security-sensitive predictive risk signal(s) without scanner evidence. Mode: enforce Findings:
Touched security-sensitive paths:
Expected evidence:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Risk TaxonomyCommit: PR taxonomy review recommended (neutral) Detected 3 PR taxonomy bucket(s): Security Evidence, Install Manifest Integrity, CI/CD Recommendation. Scanned 22 changed file(s). Roadmap taxonomy buckets: Security EvidenceSecurity-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence. Signals:
Paths:
Install Manifest IntegrityInstall manifests, plugin metadata, and shipped skills should stay synchronized with user-facing setup guidance. Signals:
Paths:
CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Reference Set ReadinessCommit: Reference set readiness gaps detected (neutral) Reference evidence present for 1/7 areas (14%) across 22 changed file(s). This check is based on files changed in this PR. Repository-level readiness is still reported by
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Hosted Promotion ReadinessCommit: Hosted promotion readiness passed (success) No hosted promotion evidence gaps detected across 22 changed file(s); 0 corpus scenarios had matching evidence. This check compares PR file changes against the evaluator/RAG promotion corpus in No evaluator corpus scenarios matched this PR. Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
There was a problem hiding this comment.
Review Summary
This PR vendors the Granola Cursor plugin into the starter kit. The integration includes comprehensive test coverage, proper documentation updates, and appropriate Docker ignore configuration.
Critical Issue Found:
- Security regex pattern bug in secret detection test that could miss hardcoded credentials
Positive aspects:
- Comprehensive test suite validates plugin structure, MCP configuration, and security
.dockerignoreproperly excludes.cursor/directory from Docker images- Documentation clearly describes the plugin and its capabilities
- MCP configuration is valid JSON with correct HTTPS endpoint
The critical regex fix is required to ensure the security test correctly detects potential credential leaks in plugin files.
You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.
|
|
||
| def test_plugin_files_do_not_embed_secrets(): | ||
| secret_pattern = re.compile( | ||
| r"(api[_-]?key|secret|token|password)\s*[:=]\s*['\"][^'\"]+['\"]", |
There was a problem hiding this comment.
🛑 Logic Error: Escaped quote characters in raw string regex will match literal backslashes instead of quotes, potentially missing hardcoded secrets like api_key = "sk-abc123". Raw strings treat \' as two characters (backslash + quote) rather than an escaped quote.
| r"(api[_-]?key|secret|token|password)\s*[:=]\s*['\"][^'\"]+['\"]", | |
| r"(api[_-]?key|secret|token|password)\s*[:=]\s*['\"][^'\"]+['\"]", |
Micro-Learning Topic: Hard-coded credential (Detected by phrase)Matched on "hardcoded credential"This vulnerability occurs when the keys used for performing the encryption are not secured properly. This could be because the keys are hard coded in the app and remain same throughout the application life cycle and for each version installed on different devices. The use of a hard coded cryptographic key tremendously increases the probability that encrypted data may be recovered. Try a challenge in Secure Code Warrior |
There was a problem hiding this comment.
🟡 Changes recommended
Critical plugin discovery and MCP configuration issues remain unresolved.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
Vendors the Granola meeting-context Cursor plugin into the starter kit.
Changes:
- Adds the Granola agent, skills, commands, rule, documentation, and licensing.
- Adds workspace and plugin MCP configurations.
- Adds validation tests, changelog entries, and Docker exclusions.
File summaries
| File | Reviewed change / final finding |
|---|---|
tests/test_granola_plugin.py |
Validates plugin structure, metadata, MCP URL, and secrets. |
README.md |
Documents setup. Critical (1 vote): does not account for Cursor’s required local-plugin installation path. |
CHANGELOG.md |
Adds the unreleased Granola integration entry. |
.dockerignore |
Excludes .cursor/ from images. |
.cursor/plugins/granola/SOURCE.md |
Records the pinned upstream source. |
.cursor/plugins/granola/skills/granola-review/SKILL.md |
Adds the Granola review skill. |
.cursor/plugins/granola/skills/granola-prep/SKILL.md |
Adds the meeting-preparation skill. |
.cursor/plugins/granola/skills/granola-context/SKILL.md |
Adds the meeting-context skill. |
.cursor/plugins/granola/rules/check-meeting-context.mdc |
Adds always-on meeting-context guidance. |
.cursor/plugins/granola/README.md |
Documents plugin usage. Critical (1 vote): requires an installation/discovery step for Cursor. |
.cursor/plugins/granola/mcp.json |
Defines the Granola MCP endpoint. Moderate (1 vote): remove the unsupported type field. |
.cursor/plugins/granola/LICENSE |
Adds plugin licensing. |
.cursor/plugins/granola/commands/granola-spec.md |
Adds the specification command. |
.cursor/plugins/granola/commands/granola-pr.md |
Adds the pull-request command. |
.cursor/plugins/granola/commands/granola-plan.md |
Adds the planning command. |
.cursor/plugins/granola/commands/granola-gaps.md |
Adds the gaps command. |
.cursor/plugins/granola/commands/granola-bug-report.md |
Adds the bug-report command. |
.cursor/plugins/granola/commands/granola-brief.md |
Adds the briefing command. |
.cursor/plugins/granola/CHANGELOG.md |
Adds plugin release notes. |
.cursor/plugins/granola/agents/granola-engineer.md |
Adds the Granola engineering agent. |
.cursor/plugins/granola/.cursor-plugin/plugin.json |
Defines plugin metadata. Moderate (1 vote): validate the loader-recognized MCP layout. |
.cursor/mcp.json |
Declares the workspace MCP server. Moderate (1 vote): remove the unsupported type field. |
Review details
Suppressed comments (3)
.cursor/mcp.json:4
- This repeats the unsupported
typeproperty in the workspace MCP config. Cursor's remote MCP format uses the HTTPSurldirectly; with this extra field the project-level server may be rejected before OAuth/tool discovery, and the same invalid shape is enforced bytest_mcp_points_at_granola_http. Removetypefrom both configs and change the test to validate the URL instead.
"type": "http",
.cursor/plugins/granola/.cursor-plugin/plugin.json:32
- The vendored source at the pinned commit bundles its MCP configuration as root
.mcp.jsonand does not use anmcpServersfield inplugin.json; this copy instead points at./mcp.json. Unless this is validated against the current Cursor plugin schema, Cursor can load the agent and skills while silently omitting the Granola tools, and the current test only proves the two local files agree. Preserve the loader-recognized MCP layout (or add a schema-level integration check) before relying on this plugin.
"mcpServers": "./mcp.json"
.cursor/plugins/granola/mcp.json:4
typeis not part of Cursor's MCP server schema for remote HTTP endpoints; the server is configured by itsurl(with optional headers), and the upstream commit referenced inSOURCE.mduses only that field. Keeping"type": "http"can make the plugin MCP config invalid so the Granola tools are unavailable. Remove this key here and in.cursor/mcp.json, and update the test that currently requires it.
"type": "http",
- Files reviewed: 22/22 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| ## Setup | ||
|
|
||
| 1. Open this repository in Cursor. | ||
| 2. The plugin lives at `.cursor/plugins/granola/` and is discovered as a local plugin. |
| Open the repo in Cursor, then sign in the first time a Granola MCP tool runs. | ||
| You need a Granola account with meeting notes. The workspace also declares the | ||
| same server in `.cursor/mcp.json`. |
v0.28.0 depends on unpublished aquasecurity/setup-trivy@v0.2.1, so Docker CI dies during action download. v0.36.0 pins setup-trivy by SHA. Co-authored-by: Adonis Jimenez <donny-devops@users.noreply.github.com>
ECC Tools / Security EvidenceCommit: Security scanner evidence required (action_required) Detected 1 security-sensitive predictive risk signal(s) without scanner evidence. Mode: enforce Findings:
Touched security-sensitive paths:
Expected evidence:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Risk TaxonomyCommit: PR taxonomy review recommended (neutral) Detected 3 PR taxonomy bucket(s): Security Evidence, Install Manifest Integrity, CI/CD Recommendation. Scanned 23 changed file(s). Roadmap taxonomy buckets: Security EvidenceSecurity-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence. Signals:
Paths:
Install Manifest IntegrityInstall manifests, plugin metadata, and shipped skills should stay synchronized with user-facing setup guidance. Signals:
Paths:
CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Reference Set ReadinessCommit: Reference set readiness gaps detected (neutral) Reference evidence present for 1/7 areas (14%) across 23 changed file(s). This check is based on files changed in this PR. Repository-level readiness is still reported by
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Hosted Promotion ReadinessCommit: Hosted promotion readiness passed (success) No hosted promotion evidence gaps detected across 23 changed file(s); 0 corpus scenarios had matching evidence. This check compares PR file changes against the evaluator/RAG promotion corpus in No evaluator corpus scenarios matched this PR. Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Config AuditCommit: No changed-config issues detected (success) Scanned 1 config file(s) present at this commit across 1 changed config path(s) and found no issues in the supported security rules. Changed config files:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Harness AuditCommit: No harness issues detected (success) Scanned 1 changed config file(s) and found no harness issues. Changed config files:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
trivy-action installs the binary via GitHub releases. Concurrent push and pull_request jobs 404 v0.70.0 under API rate limits even though the tag exists. Use the published scanner image instead. Co-authored-by: Adonis Jimenez <donny-devops@users.noreply.github.com>
ECC Tools / Security EvidenceCommit: Security scanner evidence required (action_required) Detected 1 security-sensitive predictive risk signal(s) without scanner evidence. Mode: enforce Findings:
Touched security-sensitive paths:
Expected evidence:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Risk TaxonomyCommit: PR taxonomy review recommended (neutral) Detected 3 PR taxonomy bucket(s): Security Evidence, Install Manifest Integrity, CI/CD Recommendation. Scanned 23 changed file(s). Roadmap taxonomy buckets: Security EvidenceSecurity-sensitive changes should carry explicit scanner, code-scanning, or focused regression evidence. Signals:
Paths:
Install Manifest IntegrityInstall manifests, plugin metadata, and shipped skills should stay synchronized with user-facing setup guidance. Signals:
Paths:
CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Reference Set ReadinessCommit: Reference set readiness gaps detected (neutral) Reference evidence present for 1/7 areas (14%) across 23 changed file(s). This check is based on files changed in this PR. Repository-level readiness is still reported by
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Hosted Promotion ReadinessCommit: Hosted promotion readiness passed (success) No hosted promotion evidence gaps detected across 23 changed file(s); 0 corpus scenarios had matching evidence. This check compares PR file changes against the evaluator/RAG promotion corpus in No evaluator corpus scenarios matched this PR. Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Config AuditCommit: No changed-config issues detected (success) Scanned 1 config file(s) present at this commit across 1 changed config path(s) and found no issues in the supported security rules. Changed config files:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Harness AuditCommit: No harness issues detected (success) Scanned 1 changed config file(s) and found no harness issues. Changed config files:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |


Summary
Vendors the granola-engineer Cursor plugin into this starter kit so agents can ground implementation work in Granola meeting context.
Adapted from granola-inc/granola-cursor-plugin (
56583da) into a project-local plugin at.cursor/plugins/granola/.Plugin contents
/granola-engineergranola-context,granola-prep,granola-review/granola-plan,/granola-spec,/granola-brief,/granola-bug-report,/granola-pr,/granola-gapscheck-meeting-contexthttps://mcp.granola.ai/mcp.cursor/mcp.jsonOpen the repo in Cursor and sign in the first time a Granola tool runs. A Granola account with meeting notes is required.
Tests
tests/test_granola_plugin.pyvalidates the manifest, MCP URL, frontmatter, granola-engineer tool list, and that plugin files do not embed secrets.ruff check+ruff format --checkclean).GET /healthis unchanged ({"status":"ok"}).CI
Docker build failed twice on Trivy setup:
trivy-action@v0.28.0pulls unpublishedsetup-trivy@v0.2.1.trivy-action@v0.36.0then 404strivybinaryv0.70.0on concurrent push+PR GitHub API calls.Config scan now runs
aquasec/trivy:0.74.0via Docker so it does not depend on that install path.Docs
.dockerignoreexcludes.cursor/from the API image