product-hunt-mcp
Provides tools for accessing Product Hunt data including posts, collections, topics, users, votes, and comments, with options to search/filter by topic, date, votes, and more.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@product-hunt-mcp show me today's top posts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
š Product Hunt MCP Server
A plug-and-play MCP server for Product Hunt
š¦ Quick Install
pip install product-hunt-mcpRelated 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 Tokenfor 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 ashttps://localhost:8424/callback.
Installation
Preferred: uv (fast, modern Python installer)
# Install uv if you don't have it
pip install uvInstall from PyPI (recommended)
uv pip install product-hunt-mcp
# or
pip install product-hunt-mcpInstall 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_herewith 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-mcpcommand 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-mcpUse 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.jsonmacOS:
~/Library/Application Support/claude-desktop/config.jsonLinux:
~/.config/claude-desktop/config.json
Cursor:
Windows:
%APPDATA%\Cursor\User\settings.jsonmacOS:
~/Library/Application Support/Cursor/User/settings.jsonLinux:
~/.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-mcpFor 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_TOKENis 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 |
|
get_posts | Get posts with filters |
|
get_comment | Get info about a specific comment |
|
get_post_comments | Get comments for a post |
|
get_collection | Get info about a collection |
|
get_collections | Get collections with filters |
|
get_topic | Get info about a topic |
|
search_topics | Search topics |
|
get_user | Get info about a user |
|
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_TOKENis 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!
See
pyproject.tomlfor dev dependencies.
š Links
š Notes
This project is not affiliated with Product Hunt.
The Product Hunt API is subject to change.
š License
MIT
Available Tools
11 toolscheck_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
Scored across 11 tools
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.
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.
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.
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
Related MCP Connectors
Product Hunt MCP ā wraps the Product Hunt GraphQL API v2 (api.producthunt.com)
Unwrangle MCP ā cross-retailer product + reviews data (unwrangle.com)
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server exposing 40 best-practice product management skills plus workflows and lifecycle tools, instantly accessible to any AI via Model Context Protocol.1993 npm21Apache 2.0
- AlicenseNot gradedqualityAmaintenanceMCP 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.4MIT
- AlicenseBqualityDmaintenanceAn 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.8MIT
- FlicenseNot gradedqualityDmaintenanceA 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.-