A production-ready Model Context Protocol (MCP) server for Canny feedback management. Integrate Canny with any MCP-compatible AI client to manage customer feedback, prioritize features, and streamline your product development workflow using natural language.
- 25 Comprehensive Tools - Full Canny API coverage for posts, comments, votes, users, categories, and Jira integration
- Token-Optimized - 70-90% reduction in response size vs raw API
- Jira Integration - Link posts to Jira issues seamlessly
- PM-Focused Prompts - Built-in workflows for weekly triage, sprint planning, and executive reporting
- Smart Pagination - Automatic cursor/skip handling
- Batch Operations - Efficient bulk updates for status changes and tagging
- Configurable - Flexible toolset selection and custom prompts
- Image Support: Add images to posts and comments
- ETA Management: Set and update ETAs with public/private visibility
- Owner Assignment: Assign post owners for accountability
- Company Tracking: Full company association with MRR/monthly spend
- Multi-Lookup: Find users by ID, email, or custom userID
- Company Filtering: Filter comments by company
- Status Changes: Required changerID for audit trails
- Node.js v18.18+, v20.9+, or v22+ (LTS versions recommended)
β οΈ Note: Avoid Node v23 (non-LTS, unsupported by testing tools)- Use nvm for easy version management:
nvm use
- npm v9 or higher (comes with Node.js)
- MCP Client - Any Model Context Protocol compatible client (e.g., Claude Code, Continue.dev, or custom implementations)
- Canny API Key - Get yours at canny.io/admin/settings/api
git clone https://github.com/opensourceops/canny-mcp-server.git
cd canny-mcp-servernpm installnpm run build- API Key: Visit canny.io/admin/settings/api
- Board ID: Visit your Canny board and copy the ID from the URL
- Example:
https://ideas.harness.io/admin/board/feature-request - Board ID is in the URL path or use
canny_list_boardsafter setup
- Example:
Add the server to your MCP client's configuration. The exact method depends on your client:
claude mcp add --transport stdio canny \
--env CANNY_API_KEY=your_api_key_here \
--env CANNY_DEFAULT_BOARD=your_board_id_here \
--env CANNY_CONFIG_PATH=$(pwd)/config/default.json \
-- $(which node) $(pwd)/dist/index.jsAdd to your MCP client's config file:
{
"mcpServers": {
"canny": {
"command": "node",
"args": ["/absolute/path/to/canny-mcp-server/dist/index.js"],
"env": {
"CANNY_API_KEY": "your_api_key_here",
"CANNY_DEFAULT_BOARD": "your_board_id_here",
"CANNY_CONFIG_PATH": "/absolute/path/to/canny-mcp-server/config/default.json"
}
}
}
}Replace:
your_api_key_herewith your Canny API keyyour_board_id_herewith your board ID/absolute/path/to/canny-mcp-serverwith the actual path
Completely quit and restart your MCP client for changes to take effect.
In your MCP client, ask:
Can you list the available Canny tools?
You should see a list of 25 tools including canny_list_posts, canny_create_post, canny_update_post, canny_add_vote, etc.
Try these commands in your MCP client:
Show me the latest feature requests from Canny
Get details for Canny post ID: <your-post-id>
canny_list_boards- List all boardscanny_list_categories- List categoriescanny_list_tags- List available tagscanny_list_companies- List companies
canny_list_posts- List posts with filterscanny_get_post- Get detailed post infocanny_create_post- Create new post with images, ETA, ownercanny_update_post- Update post details, title, description, ETA, imagescanny_update_post_status- Change post status with notificationscanny_change_category- Move post to different categorycanny_create_category- Create new board category
canny_list_comments- List post comments with company filteringcanny_create_comment- Add comment with image supportcanny_delete_comment- Remove commentcanny_list_votes- List votescanny_add_vote- Add votecanny_remove_vote- Remove vote
canny_find_or_create_user- Get or create user with company associationscanny_get_user_details- Get user info by ID, email, or userIDcanny_link_company- Link user to company with MRR tracking
canny_link_jira_issue- Link Jira issue to postcanny_unlink_jira_issue- Unlink Jira issue
canny_batch_update_status- Update multiple post statusescanny_batch_tag- Tag multiple postscanny_batch_merge- Merge duplicate posts
By default, the server runs in readonly mode. To enable write operations:
Edit config/default.json:
{
"server": {
"toolMode": "all" // Enable all tools including write operations
}
}Rebuild after changes:
npm run buildAvailable modes:
"readonly"- Only read operations (default, safe)"all"- All tools including write operations"posts,engagement"- Specific toolsets (comma-separated)
Add custom PM workflows by editing config/default.json:
{
"prompts": [
{
"name": "my_workflow",
"description": "My custom workflow",
"template": "Analyze feedback and..."
}
]
}See docs/PROMPT_CONFIGURATION.md for details.
- Quick Start Guide - Get started quickly
- Prompt Configuration - Configure custom prompts
- Toolset Guide - Understand toolsets and modes
- Custom Prompts - Advanced prompt examples
Test your API key:
curl https://canny.io/api/v1/boards/list --data apiKey=YOUR_API_KEYShould return your boards list.
-
Rebuild after config changes:
npm run build
-
Restart your MCP client completely (quit and reopen)
-
Check toolMode in
config/default.json -
Verify paths are absolute in your MCP client configuration
Symptoms:
npm warn EBADENGINE Unsupported engine {
package: 'expect@30.2.0',
required: { node: '^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0' }
}
Solution:
- Use Node.js LTS versions (18.18+, 20.9+, or 22+)
- Node v23 is non-LTS and unsupported by Jest
- Switch versions:
nvm use 20ornvm use 22 - Warnings are safe to ignore if you're on v23 (tests still pass)
Symptoms:
npm warn deprecated eslint@8.57.1: This version is no longer supported
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
Impact:
- These are devDependencies (testing/linting only)
- Production runtime unaffected
- Will be resolved in upcoming dependency updates
What to do:
- β Safe to ignore for now
- β All tests pass (104/104)
- β Build succeeds
- π Planned update to ESLint v9 and modern tooling
- Never commit
.envfiles or API keys to Git - Use readonly mode for general use
- Enable write mode only when needed
- Keep your
CANNY_API_KEYsecret
canny-mcp/
βββ src/ # TypeScript source code
β βββ index.ts # Main entry point
β βββ server.ts # MCP server implementation
β βββ api/ # Canny API client
β βββ tools/ # MCP tools
β βββ prompts/ # Built-in prompts
β βββ types/ # TypeScript definitions
βββ config/
β βββ default.json # Server configuration
βββ docs/ # Documentation
βββ dist/ # Compiled JavaScript (generated)
βββ package.json
βββ tsconfig.json
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
Apache 2.0 License - See LICENSE file for details
- Issues: Report bugs and feature requests via GitHub Issues
- Documentation: See
docs/folder for detailed guides - API Reference: Canny API Documentation
Built with β€οΈ for Product Managers