Skip to content

Canny MCP Server for Canny API integration with AI Assistants. Features Jira linking, batch operations, ETA management, company MRR tracking, and PM-focused workflows.

License

Notifications You must be signed in to change notification settings

opensourceops/canny-mcp-server

Repository files navigation

MseeP.ai Security Assessment Badge Verified on MseeP

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

  1. API Key — Visit canny.io/admin/settings/api
  2. Subdomain — Your Canny workspace URL: https://<subdomain>.canny.io
  3. Board ID (optional) — Find it via the Canny admin URL or by running canny_list_boards after 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 boards
  • canny_list_tags — List tags (optionally by board)
  • canny_create_tag — Create a new tag on a board
  • canny_list_categories — List categories
  • canny_list_posts — List posts with filters (status, author, company, tags)
  • canny_filter_posts — Filter by category, company, segment, tag slugs, and date ranges
  • canny_get_post — Get full post details with comments and votes
  • canny_list_status_changes — List post status change history for auditing
  • canny_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 images
  • canny_update_post_status — Change status with optional voter notification
  • canny_change_category — Move a post to a different category
  • canny_add_post_tag — Add a tag to a post
  • canny_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 votes
  • canny_create_comment — Add a comment (supports images, internal flag)
  • canny_delete_comment — Remove a comment
  • canny_add_vote — Add a vote
  • canny_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 userID
  • canny_list_companies — List companies with MRR data
  • canny_find_or_create_user — Find or create a user with company associations
  • canny_link_company — Link a user to a company

Jira (2 write tools)

  • canny_link_jira_issue — Link a Jira issue to a post
  • canny_unlink_jira_issue — Unlink a Jira issue

Changelog (2 tools: 1 read-only, 1 write)

  • canny_list_changelog_entries — List changelog entries
  • canny_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 name
  • canny_list_ideas — List ideas with filtering, search, and sorting
  • canny_get_idea — Get an idea by ID or URL name
  • canny_list_insights — List insights, optionally filtered by idea
  • canny_get_insight — Get an insight by ID
  • canny_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

  1. Rebuild after config changes: npm run build
  2. Restart your MCP client (quit and reopen)
  3. Check CANNY_TOOL_MODEreadonly excludes write tools
  4. 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 .env files or API keys
  • Use readonly mode for general use
  • Enable write tools only when needed
  • Keep CANNY_API_KEY secret

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

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests
  5. Submit a pull request

License

Apache 2.0 — See LICENSE.

Support

About

Canny MCP Server for Canny API integration with AI Assistants. Features Jira linking, batch operations, ETA management, company MRR tracking, and PM-focused workflows.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •