Skip to main content
Glama
product-hunt-mcp

product-hunt-mcp

by jaipandya

šŸš€ Product Hunt MCP Server

PyPI version License: MIT Python 3.10+ Docker Ready MCP Compatible

A plug-and-play MCP server for Product Hunt


šŸ“¦ Quick Install

pip install product-hunt-mcp

Related MCP server: MCP Hub

šŸƒā€ā™‚ļø Quick Start Example

# Run the MCP server (requires PRODUCT_HUNT_TOKEN environment variable)
export PRODUCT_HUNT_TOKEN=your_token_here
product-hunt-mcp

✨ What is this?

Product Hunt MCP Server connects Product Hunt's API to any LLM or agent that speaks the Model Context Protocol (MCP). Perfect for AI assistants, chatbots, or your own automations!

  • šŸ” Get posts, collections, topics, users

  • šŸ—³ļø Get votes, comments, and more

  • šŸ› ļø Use with Claude Desktop, Cursor, or any MCP client


šŸ› ļø Features

  • Get detailed info on posts, comments, collections, topics, users

  • Search/filter by topic, date, votes, etc.

  • Paginated comments, user upvotes, and more

  • Built with FastMCP for speed and compatibility


šŸ§‘ā€šŸ’» Who is this for?

  • AI/LLM users: Plug into Claude Desktop, Cursor, or your own agent

  • Developers: Build bots, dashboards, or automations with Product Hunt data

  • Tinkerers: Explore the MCP ecosystem and build your own tools


šŸ Setup

Prerequisites

  • Python 3.10+

  • Product Hunt API token (get one here)

    • You'll need to create an account on Product Hunt

    • Navigate to the API Dashboard and create a new application

    • Use the Developer Token for the token

Note: When creating a new application on Product Hunt, you will be asked for a redirect_uri. While the MCP server does not use the redirect URI, it is a required field. You can enter any valid URL, such as https://localhost:8424/callback.

Installation

Preferred: uv (fast, modern Python installer)

# Install uv if you don't have it
pip install uv
uv pip install product-hunt-mcp
# or
pip install product-hunt-mcp

Install from GitHub (latest main branch)

uv pip install 'git+https://github.com/jaipandya/producthunt-mcp-server.git'
# or
pip install 'git+https://github.com/jaipandya/producthunt-mcp-server.git'

Install locally from source

uv pip install .
# or
pip install .

šŸš€ Usage with Claude Desktop & Cursor

Once installed, the product-hunt-mcp command will be available. Add it to your Claude Desktop or Cursor configuration:

{
  "mcpServers": {
    "product-hunt": {
      "command": "product-hunt-mcp",
      "env": {
        "PRODUCT_HUNT_TOKEN": "your_token_here"
      }
    }
  }
}
  • Replace your_token_here with your actual Product Hunt API token.

  • The token must be set as an environment variable in your Claude Desktop or Cursor config for the server to authenticate.

  • Always restart your client (Claude Desktop/Cursor) after editing the config file.

Tip: On macOS, Claude Desktop may not always find the product-hunt-mcp command if it's not in the default PATH. If you encounter issues, you can provide the full path to the executable. After installing, run:

which product-hunt-mcp

Use the output path in your Claude Desktop config, replacing "command": "product-hunt-mcp" with the full path (e.g., "command": "/Users/youruser/.local/bin/product-hunt-mcp").

Finding your configuration file

  • Claude Desktop:

    • Windows: %APPDATA%\claude-desktop\config.json

    • macOS: ~/Library/Application Support/claude-desktop/config.json

    • Linux: ~/.config/claude-desktop/config.json

  • Cursor:

    • Windows: %APPDATA%\Cursor\User\settings.json

    • macOS: ~/Library/Application Support/Cursor/User/settings.json

    • Linux: ~/.config/Cursor/User/settings.json

Docker

You can also run the server using Docker:

# Build the Docker image
docker build -t product-hunt-mcp .

# Run the Docker container (interactive for MCP)
docker run -i --rm -e PRODUCT_HUNT_TOKEN=your_token_here product-hunt-mcp

For Claude Desktop/Cursor integration with Docker, use this configuration:

{
  "mcpServers": {
    "product-hunt": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "PRODUCT_HUNT_TOKEN=your_token_here", "product-hunt-mcp"],
      "env": {}
    }
  }
}

Security Note: Your PRODUCT_HUNT_TOKEN is sensitive. Do not share it or commit it to version control.


šŸ› ļø MCP Tools

Tool

Description

Key Parameters

get_post_details

Get info about a specific post

id or slug, comments_count, comments_after

get_posts

Get posts with filters

topic, order, count, featured, posted_before, posted_after

get_comment

Get info about a specific comment

id (required)

get_post_comments

Get comments for a post

post_id or slug, order, count, after

get_collection

Get info about a collection

id or slug

get_collections

Get collections with filters

featured, user_id, post_id, order, count

get_topic

Get info about a topic

id or slug

search_topics

Search topics

query, followed_by_user_id, order, count

get_user

Get info about a user

id or username, posts_type, posts_count

get_viewer

Get info about the authenticated user

None

check_server_status

Check server/API status & authentication

None


šŸ—ļø Project Structure

product-hunt-mcp/
ā”œā”€ā”€ src/
│   └── product_hunt_mcp/ # Main package directory
│       ā”œā”€ā”€ __init__.py
│       ā”œā”€ā”€ cli.py        # Command-line entry point
│       ā”œā”€ā”€ api/          # API clients & queries
│       ā”œā”€ā”€ schemas/      # Data validation schemas
│       ā”œā”€ā”€ tools/        # MCP tool definitions
│       └── utils/        # Utility functions
ā”œā”€ā”€ pyproject.toml      # Project metadata, dependencies, build config
ā”œā”€ā”€ README.md
ā”œā”€ā”€ CONTRIBUTING.md
ā”œā”€ā”€ CHANGELOG.md
ā”œā”€ā”€ Dockerfile
└── ... (config files, etc.)

šŸ”„ Rate Limiting

The Product Hunt API has rate limits that this client respects. If you encounter rate limit errors, the client will inform you when the rate limit resets. You can check your current rate limit status using the get_api_rate_limits or check_server_status tools.


šŸ› Troubleshooting

  • Missing token: Ensure your PRODUCT_HUNT_TOKEN is correctly set as an environment variable.

  • Connection issues: Verify your internet connection and that the Product Hunt API is accessible.

  • Rate limiting: If you hit rate limits, wait until the reset time or reduce your query frequency.

  • Claude Desktop/Cursor not finding the server: Verify the path to your Python executable and restart the client.


šŸ¤ Contributing

  • PRs and issues welcome!

  • Please follow PEP8 and use ruff for linting.

  • See pyproject.toml for dev dependencies.



šŸ“ Notes

  • This project is not affiliated with Product Hunt.

  • The Product Hunt API is subject to change.


šŸ“œ License

MIT

Available Tools

11 tools
check_server_statusA
    Check the status of the Product Hunt MCP server and authentication.

    Returns:
    - status (str): "Ready", "Not initialized", "Token invalid", or "Error".
    - authenticated (bool, optional): True if authenticated, False otherwise.
    - user (dict, optional): User details if authenticated.
    - rate_limits (dict, optional): API rate limit information.
    - message (str, optional): Additional status or error message.
    

Inputs: no named parameters.

get_collectionA
    Retrieve detailed information about a specific collection by ID or slug.

    Parameters:
    - id (str, optional): The collection's unique ID.
    - slug (str, optional): The collection's slug (e.g., "best-productivity-apps").

    At least one of `id` or `slug` must be provided.

    Returns:
    - success (bool)
    - data (dict): If successful, contains collection details:
        - id, name, description, follower_count, posts, etc.
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - Returns an error if neither `id` nor `slug` is provided, or if the collection is not found.
    

Inputs: id, slug.

get_collectionsA
    Retrieve a list of collections with optional filters.

    Parameters:
    - featured (bool, optional): Only return featured collections if True.
    - user_id (str, optional): Filter to collections created by this user ID.
    - post_id (str, optional): Filter to collections that include this post ID.
    - order (str, optional): Sorting order. Valid values: FOLLOWERS_COUNT (default), NEWEST.
    - count (int, optional): Number of collections to return (default: 10, max: 20).
    - after (str, optional): Pagination cursor for next page.

    Returns:
    - success (bool)
    - data (dict): If successful, contains:
        - collections (list): List of collection objects (id, name, etc.)
        - pagination (dict): { end_cursor, has_next_page }
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - If no collections match, `collections` will be an empty list.
    

Inputs: featured, user_id, post_id, order, +2 more.

get_commentA
    Retrieve detailed information about a specific comment by ID.

    Parameters:
    - id (str, required): The comment's unique ID.

    Returns:
    - success (bool)
    - data (dict): If successful, contains comment details:
        - id, content, created_at, user, post, etc.
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - Returns an error if the comment is not found.
    

Inputs: id.

get_post_commentsA
    Retrieve comments for a specific post by post ID or slug, with optional sorting and pagination.

    Parameters:
    - post_id (str, optional): The post's unique ID.
    - slug (str, optional): The post's slug.
    - order (str, optional): Sorting order. Valid values: NEWEST (default), OLDEST, VOTES.
    - count (int, optional): Number of comments to return (default: 10, max: 20).
    - after (str, optional): Pagination cursor for next page.

    Returns:
    - success (bool)
    - data (dict): If successful, contains:
        - comments (list): List of comment objects (id, content, etc.)
        - pagination (dict): { end_cursor, has_next_page }
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - Returns an error if the post is not found.
    

Inputs: post_id, slug, order, count, +1 more.

get_post_detailsA
    Retrieve detailed information about a specific Product Hunt post by ID or slug.

    Parameters:
    - id (str, optional): The post's unique ID.
    - slug (str, optional): The post's slug (e.g., "product-hunt-api").
    - comments_count (int, optional): Number of comments to return (default: 10, max: 20).
    - comments_after (str, optional): Pagination cursor for fetching the next page of comments.

    At least one of `id` or `slug` must be provided.

    Returns:
    - success (bool): Whether the request was successful.
    - data (dict): If successful, contains:
        - id, name, description, tagline, votes, makers, topics, media, and
        - comments (paginated): { edges: [...], pageInfo: { endCursor, hasNextPage } }
    - error (dict, optional): If unsuccessful, contains error code and message.
    - rate_limits (dict): API rate limit information.

    Notes:
    - If neither `id` nor `slug` is provided, an error is returned.
    - If the post is not found, an error is returned.
    - The dedicated `get_post_comments` tool is deprecated; use this tool for paginated comments.
    

Inputs: id, slug, comments_count, comments_after.

get_postsA
    Retrieve a list of Product Hunt posts with various filtering and sorting options.

    Parameters:
    - featured (bool, optional): Only return featured posts if True.
    - topic (str, optional): Filter by topic slug.
    - order (str, optional): Sorting order. Valid values: RANKING (default), NEWEST, VOTES, FEATURED_AT.
    - count (int, optional): Number of posts to return (default: 10, max: 20).
    - after (str, optional): Pagination cursor for next page.
    - url (str, optional): Filter posts by URL.
    - twitter_url (str, optional): Filter posts by Twitter URL.
    - posted_before (str, optional): ISO datetime to filter posts posted before this date.
    - posted_after (str, optional): ISO datetime to filter posts posted after this date.

    Returns:
    - success (bool)
    - data (dict): If successful, contains:
        - posts (list): List of post objects (id, name, description, etc.)
        - pagination (dict): { end_cursor, has_next_page }
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - This is not a keyword search; use filters to narrow results.
    - If no posts match, `posts` will be an empty list.
    - Invalid date formats return a user-friendly error.
    

Inputs: featured, topic, order, count, +5 more.

get_topicA
    Retrieve detailed information about a specific topic by ID or slug.

    Parameters:
    - id (str, optional): The topic's unique ID.
    - slug (str, optional): The topic's slug (e.g., "artificial-intelligence").

    At least one of `id` or `slug` must be provided.

    Returns:
    - success (bool)
    - data (dict): If successful, contains topic details:
        - id, name, description, follower_count, posts, etc.
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - Returns an error if neither `id` nor `slug` is provided, or if the topic is not found.
    

Inputs: id, slug.

get_userA
    Retrieve user information by ID or username, with optional retrieval of their posts.

    Parameters:
    - id (str, optional): The user's unique ID.
    - username (str, optional): The user's username.
    - posts_type (str, optional): Type of posts to retrieve. Valid values: MADE (default), VOTED.
    - posts_count (int, optional): Number of posts to return (default: 10, max: 20).
    - posts_after (str, optional): Pagination cursor for next page of posts.

    At least one of `id` or `username` must be provided.

    Returns:
    - success (bool)
    - data (dict): If successful, contains user details and optionally their posts.
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - Returns an error if neither `id` nor `username` is provided, or if the user is not found.
    

Inputs: id, username, posts_type, posts_count, +1 more.

get_viewerA
    Retrieve information about the currently authenticated user.

    Parameters:
    - None

    Returns:
    - success (bool)
    - data (dict): If successful, contains user details.
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - Returns an error if the token is invalid or expired.
    

Inputs: no named parameters.

search_topicsA
    Search for topics by name or filter by user following, with optional sorting and pagination.

    Parameters:
    - query (str, optional): Search term to find topics by name.
    - followed_by_user_id (str, optional): Only topics followed by this user ID.
    - order (str, optional): Sorting order. Valid values: FOLLOWERS_COUNT (default), NAME, NEWEST.
    - count (int, optional): Number of topics to return (default: 10, max: 20).
    - after (str, optional): Pagination cursor for next page.

    Returns:
    - success (bool)
    - data (dict): If successful, contains:
        - topics (list): List of topic objects (id, name, etc.)
        - pagination (dict): { end_cursor, has_next_page }
    - error (dict, optional)
    - rate_limits (dict)

    Notes:
    - If no topics match, `topics` will be an empty list.
    

Inputs: query, followed_by_user_id, order, count, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 11 tools

    Disambiguation5/5

    Each tool has a distinct purpose targeting specific resources and actions with clear boundaries. For example, get_post_details retrieves post information while get_post_comments focuses specifically on comments, and get_collection vs get_collections handle single vs multiple collections. There is no functional overlap that would cause confusion.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern using snake_case throughout. The naming convention is perfectly uniform with 'get_' for retrieval operations, 'search_' for search operations, and 'check_' for status checking. Every tool name clearly indicates its function.

    Tool Count5/5

    With 11 tools, this server is well-scoped for the Product Hunt domain. The tools cover posts, comments, collections, topics, users, and status checking without being overwhelming. Each tool serves a specific, necessary function in the API surface area.

    Completeness4/5

    The tool set provides comprehensive read/search operations for all major Product Hunt entities (posts, comments, collections, topics, users). The main gap is the absence of write operations (creating/updating posts, comments, votes, etc.), but for a read-focused API server, the coverage is quite complete with good pagination and filtering support.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server exposing 40 best-practice product management skills plus workflows and lifecycle tools, instantly accessible to any AI via Model Context Protocol.
      19
      93 npm
      21
      Apache 2.0
    • A
      license
      Not graded
      quality
      A
      maintenance
      MCP Hub is a self-hosted AI operations platform that provides a unified MCP gateway with semantic tool routing, persistent vector memory, automation, and multi-agent flows. It enables connecting any MCP client to 130+ tools across 12 integrations through just 3 hub endpoints.
      4
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      An AI-powered Product Management Operating System that provides tools for PRDs, user stories, prioritization, competitor analysis, roadmaps, KPIs, meeting notes, and product strategy via MCP clients.
      8
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A full-feature MCP server that serves as a product-development copilot, providing RAG search, SQL queries, and inline chart visualizations from seeded product data, with per-user identity and its own OAuth login.
      -