Canny MCP Server
MCP server integration for Canny.io customer feedback management
Installation
npx canny-mcp-serverAsk AI about Canny MCP Server
Powered by Claude Β· Grounded in docs
I know everything about Canny MCP Server. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
Canny MCP Server
A Model Context Protocol (MCP) server for Canny feedback management. Connect Canny to any MCP-compatible AI client to manage customer feedback, prioritize features, and streamline product development through natural language.
Features
- 37 Tools β Full Canny API coverage: posts, comments, votes, users, categories, tags, changelog, status changes, ideas, insights, groups, opportunities, and Jira integration
- Token-Optimized β 70β90% smaller responses than the raw API
- Jira Integration β Link posts to Jira issues
- PM Workflows β Built-in prompts for weekly triage, sprint planning, and executive reporting
- Smart Pagination β Automatic cursor/skip handling
- Batch Operations β Bulk status changes
- Configurable Toolsets β Readonly by default; enable write tools selectively
Prerequisites
- Node.js v20.9+, v22+, or v24+ (LTS versions)
- npm v9+
- MCP Client β Claude Code, Continue.dev, or any MCP-compatible client
- Canny API Key β Get one at canny.io/admin/settings/api
Quick Start with Claude Code
The fastest way to start: run npx directly through Claude Code. No clone, no build.
Step 1: Get Your Canny Credentials
- API Key β Visit canny.io/admin/settings/api
- Subdomain β Your Canny workspace URL:
https://<subdomain>.canny.io - Board ID (optional) β Find it via the Canny admin URL or by running
canny_list_boardsafter setup
Step 2: Add the MCP Server
claude mcp add --transport stdio canny \
--scope user \
--env CANNY_SUBDOMAIN=<COMPANY_SUBDOMAIN> \
--env CANNY_API_KEY=<CANNY_API_KEY> \
--env CANNY_DEFAULT_BOARD=<BOARD_ID> \
--env CANNY_TOOL_MODE=readonly \
-- npx -y @opensourceops/canny-mcp
Replace <COMPANY_SUBDOMAIN>, <CANNY_API_KEY>, and <BOARD_ID> with your values.
Step 3: Restart Claude Code
Quit and reopen Claude Code for the new server to load.
Step 4: Verify
Ask Claude:
List the available Canny tools.
You should see 37 tools, including canny_list_posts, canny_get_post, and canny_list_ideas.
Global Install
To install the package globally:
npm install -g @opensourceops/canny-mcp
Then configure your MCP client to run canny-mcp-server instead of npx:
{
"mcpServers": {
"canny": {
"command": "canny-mcp-server",
"env": {
"CANNY_API_KEY": "your_api_key",
"CANNY_SUBDOMAIN": "your_subdomain",
"CANNY_DEFAULT_BOARD": "your_board_id",
"CANNY_TOOL_MODE": "readonly"
}
}
}
}
Available Tools
Discovery (9 tools: 8 read-only, 1 write)
canny_list_boardsβ List all boardscanny_list_tagsβ List tags (optionally by board)canny_create_tagβ Create a new tag on a boardcanny_list_categoriesβ List categoriescanny_list_postsβ List posts with filters (status, author, company, tags)canny_filter_postsβ Filter by category, company, segment, tag slugs, and date rangescanny_get_postβ Get full post details with comments and votescanny_list_status_changesβ List post status change history for auditingcanny_create_categoryβ Create a board category
Posts (6 write tools)
canny_create_postβ Create a post (supports images, ETA, owner)canny_update_postβ Update title, description, ETA, or imagescanny_update_post_statusβ Change status with optional voter notificationcanny_change_categoryβ Move a post to a different categorycanny_add_post_tagβ Add a tag to a postcanny_remove_post_tagβ Remove a tag from a post
Engagement (6 tools: 2 read-only, 4 write)
canny_list_commentsβ List comments (filterable by company)canny_list_votesβ List votescanny_create_commentβ Add a comment (supports images, internal flag)canny_delete_commentβ Remove a commentcanny_add_voteβ Add a votecanny_remove_voteβ Remove a vote
Users & Companies (4 tools: 2 read-only, 2 write)
canny_get_user_detailsβ Look up a user by ID, email, or custom userIDcanny_list_companiesβ List companies with MRR datacanny_find_or_create_userβ Find or create a user with company associationscanny_link_companyβ Link a user to a company
Jira (2 write tools)
canny_link_jira_issueβ Link a Jira issue to a postcanny_unlink_jira_issueβ Unlink a Jira issue
Changelog (2 tools: 1 read-only, 1 write)
canny_list_changelog_entriesβ List changelog entriescanny_create_changelog_entryβ Create a changelog entry to communicate product updates
Ideas Ecosystem (7 read-only tools)
canny_list_groupsβ List groups (cursor-based pagination)canny_get_groupβ Get a group by ID or URL namecanny_list_ideasβ List ideas with filtering, search, and sortingcanny_get_ideaβ Get an idea by ID or URL namecanny_list_insightsβ List insights, optionally filtered by ideacanny_get_insightβ Get an insight by IDcanny_list_opportunitiesβ List Salesforce opportunities linked to Canny
Batch (1 write tool)
canny_batch_update_statusβ Update multiple post statuses at once
Configuration
Tool Modes
The server runs in readonly mode by default (19 read-only tools). To enable write operations, set CANNY_TOOL_MODE:
| Mode | Tools | Description |
|---|---|---|
readonly | 19 | Read-only tools only (default) |
all | 37 | All tools, including writes |
discovery,posts | varies | Specific toolsets (comma-separated) |
Set via environment variable or config/default.json:
{
"server": {
"toolMode": "all"
}
}
Rebuild after changing config/default.json:
npm run build
Environment Variables
Canny API (required)
| Variable | Default | Description |
|---|---|---|
CANNY_API_KEY | -- | Your Canny API key (required) |
CANNY_BASE_URL | https://canny.io/api/v1 | Canny API base URL |
CANNY_SUBDOMAIN | auto-detected | Your Canny subdomain; auto-detected from CANNY_BASE_URL if *.canny.io |
CANNY_CONFIG_PATH | config/default.json | Path to the JSON config file |
Workspace
| Variable | Default | Description |
|---|---|---|
CANNY_DEFAULT_BOARD | -- | Default board ID |
CANNY_WORKSPACE_NAME | Default | Workspace display name |
CANNY_CUSTOM_STATUSES | open,under review,planned,in progress,complete,closed | Comma-separated list of valid statuses |
Jira Integration
| Variable | Default | Description |
|---|---|---|
CANNY_JIRA_ENABLED | false | Enable Jira integration (true/false) |
CANNY_JIRA_PROJECT_KEY | -- | Jira project key (e.g., PROJ) |
Pagination & Display
| Variable | Default | Description |
|---|---|---|
CANNY_PAGINATION_LIMIT | 10 | Results per page |
CANNY_PAGINATION_MAX | 50 | Maximum total results |
CANNY_COMPACT_MODE | true | Return compact responses (true/false) |
Cache
| Variable | Default | Description |
|---|---|---|
CANNY_CACHE_ENABLED | true | Enable response caching (true/false) |
CANNY_CACHE_MAX_SIZE | 100 | Maximum cache entries |
Rate Limiting
| Variable | Default | Description |
|---|---|---|
CANNY_RATE_LIMIT_REQUESTS | 100 | Maximum requests per window |
CANNY_RATE_LIMIT_WINDOW | 60000 | Rate limit window in milliseconds |
Server
| Variable | Default | Description |
|---|---|---|
CANNY_TOOL_MODE | readonly | readonly, all, or comma-separated toolsets |
SERVER_TRANSPORT | stdio | Transport mode: stdio, http, or both |
SERVER_HTTP_PORT | 3000 | HTTP server port (when transport includes http) |
SERVER_HTTP_HOST | 0.0.0.0 | HTTP server bind address |
Logging
| Variable | Default | Description |
|---|---|---|
LOG_LEVEL | info | Log level: debug, info, warn, error |
LOG_FORMAT | json | Log format: json or pretty |
Custom Prompts
The server ships with 5 built-in prompts (weekly_triage, sprint_planning, executive_summary, jira_sync_status, customer_impact). Add your own in config/default.json:
{
"prompts": [
{
"name": "my_workflow",
"description": "Custom triage workflow",
"template": "Analyze feedback and..."
}
]
}
See Prompt Configuration for the full guide and Custom Prompts for advanced examples.
Local Development Environment
Clone the repository to modify the server, run tests, or contribute.
Step 1: Clone and Build
git clone https://github.com/opensourceops/canny-mcp-server.git
cd canny-mcp-server
npm install
npm run build
Step 2: Configure Your MCP Client
Option A: Claude Code (via CLI)
claude mcp add --transport stdio canny \
--env CANNY_API_KEY=your_api_key \
--env CANNY_SUBDOMAIN=your_subdomain \
--env CANNY_DEFAULT_BOARD=your_board_id \
--env CANNY_CONFIG_PATH=$(pwd)/config/default.json \
-- $(which node) $(pwd)/dist/index.js
Option B: Manual JSON Configuration
Add 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",
"CANNY_SUBDOMAIN": "your_subdomain",
"CANNY_DEFAULT_BOARD": "your_board_id",
"CANNY_CONFIG_PATH": "/absolute/path/to/canny-mcp-server/config/default.json"
}
}
}
}
Step 3: Restart and Verify
Restart your MCP client, then ask:
Show me the latest feature requests from Canny.
Documentation
Troubleshooting
API Key Issues
Test your key directly:
curl https://canny.io/api/v1/boards/list --data apiKey=YOUR_API_KEY
This should return your boards.
Tools Not Appearing
- Rebuild after config changes:
npm run build - Restart your MCP client (quit and reopen)
- Check
CANNY_TOOL_MODEβreadonlyexcludes write tools - Use absolute paths in manual JSON configuration
Node.js Version Warnings
Use Node.js LTS versions (20.9+, 22+, or 24+). Odd-numbered releases (23, 25) are non-LTS and unsupported. Switch with nvm use 20 or nvm use 22.
Deprecated package warnings (ESLint, glob) affect only devDependencies and do not affect production runtime.
Security
- Never commit
.envfiles or API keys - Use
readonlymode for general use - Enable write tools only when needed
- Keep
CANNY_API_KEYsecret
Project Structure
canny-mcp-server/
βββ src/ # TypeScript source
β βββ index.ts # Entry point
β βββ server.ts # MCP server
β βββ api/ # Canny API client
β βββ tools/ # MCP tools
β βββ prompts/ # Built-in prompts
β βββ types/ # Type definitions
βββ config/
β βββ default.json # Server configuration
βββ docs/ # Documentation
βββ dist/ # Compiled output (generated)
βββ package.json
βββ tsconfig.json
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
License
Apache 2.0 β See LICENSE.
Support
- Issues β GitHub Issues
- API Reference β Canny API Documentation

