Canny MCP Server
A Model Context Protocol (MCP) server for Canny feedback management. Enables managing customer feedback, prioritizing features, and streamlining product development through natural language.
README
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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
