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
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
