Skip to main content
Glama

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

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
3Releases (12mo)

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/opensourceops/canny-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server