Skip to main content
Glama
Reddit MCP Server

Reddit MCP Server

by Arindam200

Reddit MCP Server

This repository contains a Model Context Protocol server implementation for Reddit that allows AI assistants to access and interact with Reddit content through PRAW (Python Reddit API Wrapper).

image

What is MCP?

The Model Context Protocol (MCP) is a standard for enabling AI assistants to interface with external services, tools, and data sources. This server implements the MCP specification to provide access to Reddit content.

To know more about MCP, Check this video

Related MCP server: Reddit MCP

Features

  • Get detailed user information with engagement analysis

  • Retrieve user comment and post history with flexible filtering

  • Fetch and analyze top posts from any subreddit

  • Search for posts across all of Reddit or within specific subreddits using search terms

  • Get comprehensive subreddit statistics and health metrics

  • View trending subreddits with growth patterns

  • Create strategic posts with timing recommendations

  • Reply to posts and comments with engagement optimization

  • AI-driven insights and recommendations

  • Smart response formatting with engagement metrics

Installation

  1. Clone this repository

git clone https://github.com/Arindam200/reddit-mcp.git
cd reddit-mcp
  1. Connect to the MCP server

    Copy the below json with the appropriate {{PATH}} values:

    {
      "mcpServers": {
        "reddit": {
          "command": "{{PATH_TO_UV}}", // Run `which uv` and place the output here
          "args": [
            "--directory",
            "{{PATH_TO_SRC}}", // cd into the repo, run `pwd` and enter the output here
            "run",
            "server.py"
          ],
          "env": {
            "REDDIT_CLIENT_ID": "your_client_id",
            "REDDIT_CLIENT_SECRET": "your_client_secret",
            "REDDIT_USERNAME": "your_username", // Optional for authenticated operations
            "REDDIT_PASSWORD": "your_password" // Optional for authenticated operations
          }
        }
      }
    }

    You can obtain Reddit API credentials by creating an app at Reddit's app preferences page.

    For Claude, save this as claude_desktop_config.json in your Claude Desktop configuration directory at:

    ~/Library/Application Support/Claude/claude_desktop_config.json

    For Cursor, save this as mcp.json in your Cursor configuration directory at:

    ~/.cursor/mcp.json
  2. Restart Claude Desktop / Cursor

    Open Claude Desktop and you should now see Reddit as an available integration.

    Or restart Cursor.

Available Tools

The server provides the following tools:

Read-only Tools (require only client credentials):

  • get_user_info(username) - Get detailed user analysis with engagement insights

  • get_user_comments(username, sort, time_filter, limit) - Get a user's comment history with filtering options

  • get_user_posts(username, sort, time_filter, limit) - Get a user's post/submission history with filtering options

  • get_top_posts(subreddit, time_filter, limit) - Get and analyze top posts

  • search_posts(query, subreddit, sort, time_filter, limit) - Search for posts across Reddit or within a specific subreddit

  • get_subreddit_stats(subreddit) - Get comprehensive subreddit analysis

  • get_trending_subreddits() - Get list of trending subreddits

  • get_submission_by_url(url) - Get a Reddit submission by its URL

  • get_submission_by_id(submission_id) - Get a Reddit submission by its ID

Authenticated Tools (require user credentials):

  • who_am_i() - Get information about the currently authenticated user

  • create_post(subreddit, title, content, flair, is_self) - Create an optimized post

  • reply_to_post(post_id, content, subreddit) - Add a reply with engagement insights

  • reply_to_comment(comment_id, content, subreddit) - Add a strategic reply

Example Queries

Here are some examples of what you can ask an AI assistant connected to this server:

  • "Who am I on Reddit?" or "Show my Reddit profile"

  • "Analyze u/spez's Reddit activity"

  • "Show me u/spez's recent comments"

  • "Get the top posts by u/poem_for_your_sprog from the past year"

  • "Show me the most controversial comments by u/username"

  • "Show me the top posts from r/Python this week"

  • "Search for posts about 'machine learning' across all of Reddit"

  • "Find posts about 'beginner tutorials' in r/learnprogramming from this month"

  • "Get statistics about r/AskReddit"

  • "What are the trending subreddits right now?"

  • "Create a post in r/Python about a new project"

  • "Reply to this post with an insightful comment"

  • "What's the best time to post in this subreddit?"

Advanced Features

AI-Driven Analysis

The server provides intelligent analysis in several areas:

  1. User Analysis

    • Engagement patterns

    • Activity trends

    • Community influence

    • Personalized recommendations

  2. Post Analysis

    • Performance metrics

    • Engagement quality

    • Timing optimization

    • Content impact assessment

  3. Community Analysis

    • Health indicators

    • Growth patterns

    • Activity metrics

    • Engagement opportunities

Smart Response Formatting

  • Organized bullet points

  • Engagement statistics

  • AI-driven insights

  • Strategic recommendations

  • Performance metrics

Authentication

The server supports two levels of authentication:

  1. Read-only Access

    • Requires: client_id and client_secret

    • Allows: Fetching public data, reading posts/comments

  2. Authenticated Access

    • Requires: All read-only credentials PLUS username and password

    • Allows: All read-only operations PLUS posting and commenting

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Available Tools

15 tools
create_postA

Create a new post in a subreddit.

Args:
    subreddit: Name of the subreddit to post in (with or without 'r/' prefix)
    title: Title of the post (max 300 characters)
    content: Content of the post (text for self posts, URL for link posts)
    flair: Flair to add to the post. Must be an available flair in the subreddit
    is_self: Whether this is a self (text) post (True) or link post (False)

Returns:
    Dictionary containing information about the created post

Raises:
    ValueError: If input validation fails or flair is invalid
    RuntimeError: For other errors during post creation

Inputs: subreddit (required), title (required), content (required), flair, +1 more.

get_submission_by_idA

Get a Reddit submission by its ID.

Args:
    submission_id: The ID of the Reddit submission to retrieve (can be full URL or just ID)
    include_comments: If True, load and return the full comment forest for the post
    comment_replace_more_limit: Limit for replacing "MoreComments" objects (0 for none, None for all)

Returns:
    Dictionary containing structured submission information with the following structure:
    {
        'id': str,  # Submission ID (e.g., 'abc123')
        'title': str,  # Submission title
        'author': str,  # Author's username or '[deleted]' if deleted
        'subreddit': str,  # Subreddit name
        'score': int,  # Post score (upvotes - downvotes)
        'upvote_ratio': float,  # Ratio of upvotes to total votes
        'num_comments': int,  # Number of comments
        'created_utc': float,  # Post creation timestamp (UTC)
        'url': str,  # Full URL to the post
        'permalink': str,  # Relative URL to the post
        'is_self': bool,  # Whether it's a self (text) post
        'selftext': str,  # Content of self post (if any)
        'selftext_html': Optional[str],  # HTML formatted content
        'link_url': str,  # URL for link posts (if any)
        'domain': str,  # Domain of the linked content
        'over_18': bool,  # Whether marked as NSFW
        'spoiler': bool,  # Whether marked as spoiler
        'stickied': bool,  # Whether stickied in the subreddit
        'locked': bool,  # Whether comments are locked
        'archived': bool,  # Whether the post is archived
        'distinguished': Optional[str],  # Distinguishing type (e.g., 'moderator')
        'flair': Optional[Dict],  # Post flair information if any
        'media': Optional[Dict],  # Media information if any
        'preview': Optional[Dict],  # Preview information if available
        'awards': List[Dict],  # List of awards received
        'comments': Optional[List[Dict]],  # present if include_comments is True
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'subreddit_id': str,  # Subreddit full ID
            'author_id': str,  # Author's full ID if available
            'is_original_content': bool,  # Whether marked as OC
            'is_meta': bool,  # Whether marked as meta
            'is_crosspostable': bool,  # Whether can be crossposted
            'is_reddit_media_domain': bool,  # Whether media is hosted on Reddit
            'is_robot_indexable': bool,  # Whether search engines should index
            'is_created_from_ads_ui': bool,  # Whether created via ads UI
            'is_video': bool,  # Whether the post is a video
            'pinned': bool,  # Whether the post is pinned in the subreddit
            'gilded': int,  # Number of times gilded
            'total_awards_received': int,  # Total number of awards received
            'view_count': Optional[int],  # View count if available
            'visited': bool,  # Whether the current user has visited
        }
    }

Raises:
    ValueError: If submission_id is invalid or submission not found
    RuntimeError: For other errors during the operation

Inputs: submission_id (required), include_comments, comment_replace_more_limit.

get_submission_by_urlA

Get a Reddit submission by its URL.

Args:
    url: The URL of the Reddit submission to retrieve
    include_comments: If True, load and return the full comment forest for the post
    comment_replace_more_limit: Limit for replacing "MoreComments" objects (0 for none, None for all)

Returns:
    Dictionary containing structured submission information with the following structure:
    {
        'id': str,  # Submission ID (e.g., 'abc123')
        'title': str,  # Submission title
        'author': str,  # Author's username or '[deleted]' if deleted
        'subreddit': str,  # Subreddit name
        'score': int,  # Post score (upvotes - downvotes)
        'upvote_ratio': float,  # Ratio of upvotes to total votes
        'num_comments': int,  # Number of comments
        'created_utc': float,  # Post creation timestamp (UTC)
        'url': str,  # Full URL to the post
        'permalink': str,  # Relative URL to the post
        'is_self': bool,  # Whether it's a self (text) post
        'selftext': str,  # Content of self post (if any)
        'selftext_html': Optional[str],  # HTML formatted content
        'link_url': str,  # URL for link posts (if any)
        'domain': str,  # Domain of the linked content
        'over_18': bool,  # Whether marked as NSFW
        'spoiler': bool,  # Whether marked as spoiler
        'stickied': bool,  # Whether stickied in the subreddit
        'locked': bool,  # Whether comments are locked
        'archived': bool,  # Whether the post is archived
        'distinguished': Optional[str],  # Distinguishing type (e.g., 'moderator')
        'flair': Optional[Dict],  # Post flair information if any
        'media': Optional[Dict],  # Media information if any
        'preview': Optional[Dict],  # Preview information if available
        'awards': List[Dict],  # List of awards received
        'comments': Optional[List[Dict]],  # present if include_comments is True
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'subreddit_id': str,  # Subreddit full ID
            'author_id': str,  # Author's full ID if available
            'is_original_content': bool,  # Whether marked as OC
            'is_meta': bool,  # Whether marked as meta
            'is_crosspostable': bool,  # Whether can be crossposted
            'is_reddit_media_domain': bool,  # Whether media is hosted on Reddit
            'is_robot_indexable': bool,  # Whether search engines should index
            'is_created_from_ads_ui': bool,  # Whether created via ads UI
            'is_video': bool,  # Whether the post is a video
            'pinned': bool,  # Whether the post is pinned in the subreddit
            'gilded': int,  # Number of times gilded
            'total_awards_received': int,  # Total number of awards received
            'view_count': Optional[int],  # View count if available
            'visited': bool,  # Whether the current user has visited
        }
    }

Raises:
    ValueError: If URL is invalid or submission not found
    RuntimeError: For other errors during the operation

Inputs: url (required), include_comments, comment_replace_more_limit.

get_subreddit_infoB

Get information about a subreddit.

Args:
    subreddit_name: Name of the subreddit (with or without 'r/' prefix)

Returns:
    Dictionary containing subreddit information

Raises:
    ValueError: If subreddit_name is invalid or subreddit not found
    RuntimeError: For other errors during the operation

Inputs: subreddit_name (required).

get_subreddit_statsA

Get statistics and information about a subreddit.

Args:
    subreddit: Name of the subreddit (with or without 'r/' prefix)

Returns:
    Dictionary containing structured subreddit information with the following structure:
    {
        'id': str,  # Subreddit ID (e.g., '2qgzt')
        'display_name': str,  # Subreddit display name (without r/ prefix)
        'title': str,  # Subreddit title
        'public_description': str,  # Public description
        'description': str,  # Full description (can include markdown)
        'subscribers': int,  # Number of subscribers
        'active_user_count': Optional[int],  # Currently active users if available
        'created_utc': float,  # Creation timestamp (UTC)
        'over18': bool,  # Whether marked as NSFW
        'submission_type': str,  # Allowed submission types (any, link, self)
        'allow_images': bool,  # Whether image uploads are allowed
        'allow_videos': bool,  # Whether video uploads are allowed
        'allow_polls': bool,  # Whether polls are allowed
        'spoilers_enabled': bool,  # Whether spoiler tags are enabled
        'wikienabled': bool,  # Whether wiki is enabled
        'user_is_banned': bool,  # Whether current user is banned
        'user_is_moderator': bool,  # Whether current user is a moderator
        'user_is_subscriber': bool,  # Whether current user is a subscriber
        'mod_permissions': List[str],  # Moderator permissions if applicable
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'url': str,  # Full URL to the subreddit
            'moderators_count': int,  # Number of moderators
            'rules': List[Dict],  # Subreddit rules if available
            'features': Dict[str, bool],  # Enabled subreddit features
        }
    }

Raises:
    ValueError: If subreddit is invalid or not found
    RuntimeError: For other errors during the operation

Inputs: subreddit (required).

get_top_postsA

Get top posts from a subreddit.

Args:
    subreddit: Name of the subreddit (with or without 'r/' prefix)
    time_filter: Time period to filter posts (e.g. "day", "week", "month", "year", "all")
    limit: Number of posts to fetch (1-100)
    include_comments: If True, load and return the full comment forest for each post
    comment_replace_more_limit: Limit for replacing "MoreComments" objects (0 for none, None for all)

Returns:
    Dictionary containing structured post information with the following structure:
    {
        'subreddit': str,  # Subreddit name
        'time_filter': str,  # The time period used for filtering
        'posts': [  # List of posts, each with the following structure:
            {
                'id': str,  # Post ID
                'title': str,  # Post title
                'author': str,  # Author's username
                'score': int,  # Post score (upvotes - downvotes)
                'upvote_ratio': float,  # Ratio of upvotes to total votes
                'num_comments': int,  # Number of comments
                'created_utc': float,  # Post creation timestamp
                'url': str,  # URL to the post
                'permalink': str,  # Relative URL to the post
                'is_self': bool,  # Whether it's a self (text) post
                'selftext': str,  # Content of self post (if any)
                'link_url': str,  # URL for link posts (if any)
                'over_18': bool,  # Whether marked as NSFW
                'spoiler': bool,  # Whether marked as spoiler
                'stickied': bool,  # Whether stickied in the subreddit
                'locked': bool,  # Whether comments are locked
                'distinguished': Optional[str],  # Distinguishing type (e.g., 'moderator')
                'flair': Optional[Dict],  # Post flair information if any
                'comments': Optional[List[Dict]],  # present if include_comments is True
            },
            ...
        ],
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'post_count': int,  # Number of posts returned
        }
    }

Raises:
    ValueError: If subreddit is invalid or time_filter is not valid
    RuntimeError: For other errors during the operation

Inputs: subreddit (required), time_filter, limit, include_comments, +1 more.

get_user_commentsA

Get a user's comment history.

Args:
    username: The username of the Reddit user (with or without 'u/' prefix)
    sort: Sort order for comments - one of: "new", "hot", "top", "controversial"
    time_filter: Time period to filter comments (e.g. "hour", "day", "week", "month", "year", "all")
    limit: Number of comments to return (1-100)

Returns:
    Dictionary containing structured comment history with the following structure:
    {
        'username': str,  # The username
        'sort': str,  # Sort method used
        'time_filter': str,  # Time filter used
        'comments': [  # List of comments
            {
                'id': str,  # Comment ID
                'body': str,  # Comment text content
                'author': str,  # Author's username
                'subreddit': str,  # Subreddit where comment was posted
                'score': int,  # Comment score (upvotes - downvotes)
                'created_utc': float,  # Comment creation timestamp
                'permalink': str,  # Relative URL to the comment
                'link_title': str,  # Title of the post being commented on
                'link_id': str,  # ID of the post
                'parent_id': str,  # ID of parent comment or post
                'is_submitter': bool,  # Whether commenter is the post author
                'stickied': bool,  # Whether comment is stickied
                'distinguished': Optional[str],  # Distinguishing type (e.g., 'moderator')
                'edited': bool,  # Whether comment has been edited
                'gilded': int,  # Number of times gilded
                'controversiality': int,  # Controversy score
                'depth': int,  # Comment depth in thread (0 for top-level)
            },
            ...
        ],
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'comment_count': int,  # Number of comments returned
        }
    }

Raises:
    ValueError: If username is invalid, sort method is invalid, or time_filter is invalid
    RuntimeError: For other errors during the operation

Inputs: username (required), sort, time_filter, limit.

get_user_infoA

Get information about a Reddit user.

Args:
    username: The username of the Reddit user to get info for

Returns:
    Dictionary containing user information with the following structure:
    {
        'username': str,  # User's username
        'created_utc': float,  # Account creation timestamp
        'comment_karma': int,  # User's comment karma
        'link_karma': int,  # User's post/link karma
        'has_verified_email': bool,  # Whether email is verified
        'is_mod': bool,  # Whether user is a moderator
        'is_gold': bool,  # Whether user has Reddit premium
        'has_subscribed': bool,  # Whether user has subscribed to premium
        'is_employee': bool,  # Whether user is a Reddit employee
        'over_18': bool,  # Whether user is marked as NSFW
        'is_suspended': bool,  # Whether account is suspended
        'suspension_expiration_utc': Optional[float],  # When suspension ends if suspended
        'total_karma': int,  # Total karma (comments + posts)
        'subreddit': Optional[Dict],  # User's profile subreddit info if exists
    }

Raises:
    ValueError: If the username is invalid or not found
    RuntimeError: For other errors during the operation

Inputs: username (required).

get_user_postsA

Get a user's post/submission history.

Args:
    username: The username of the Reddit user (with or without 'u/' prefix)
    sort: Sort order for posts - one of: "new", "hot", "top", "controversial"
    time_filter: Time period to filter posts (e.g. "hour", "day", "week", "month", "year", "all")
    limit: Number of posts to return (1-100)

Returns:
    Dictionary containing structured post history with the following structure:
    {
        'username': str,  # The username
        'sort': str,  # Sort method used
        'time_filter': str,  # Time filter used
        'posts': [  # List of posts
            {
                'id': str,  # Post ID
                'title': str,  # Post title
                'author': str,  # Author's username
                'subreddit': str,  # Subreddit name
                'score': int,  # Post score (upvotes - downvotes)
                'upvote_ratio': float,  # Ratio of upvotes to total votes
                'num_comments': int,  # Number of comments
                'created_utc': float,  # Post creation timestamp
                'url': str,  # Full URL to the post
                'permalink': str,  # Relative URL to the post
                'is_self': bool,  # Whether it's a self (text) post
                'selftext': str,  # Content of self post (if any)
                'link_url': str,  # URL for link posts (if any)
                'domain': str,  # Domain of the linked content
                'over_18': bool,  # Whether marked as NSFW
                'spoiler': bool,  # Whether marked as spoiler
                'stickied': bool,  # Whether stickied in the subreddit
                'locked': bool,  # Whether comments are locked
                'distinguished': Optional[str],  # Distinguishing type (e.g., 'moderator')
                'gilded': int,  # Number of times gilded
            },
            ...
        ],
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'post_count': int,  # Number of posts returned
        }
    }

Raises:
    ValueError: If username is invalid, sort method is invalid, or time_filter is invalid
    RuntimeError: For other errors during the operation

Inputs: username (required), sort, time_filter, limit.

join_subredditA

Join (subscribe to) or leave (unsubscribe from) a subreddit.

Args:
    subreddit_name: Name of the subreddit to join/leave (with or without 'r/' prefix)
    unsubscribe: If True, leave the subreddit instead of joining

Returns:
    Dictionary containing information about the action and subreddit

Raises:
    ValueError: If subreddit name is invalid or subreddit not found
    RuntimeError: For other errors during the operation

Inputs: subreddit_name (required), unsubscribe.

reply_to_commentA

Post a reply to an existing Reddit comment.

Args:
    comment_id: The ID of the comment to reply to (can be full URL, permalink, or just ID)
    content: The content of the reply (1-10000 characters)

Returns:
    Dictionary containing information about the created reply and parent comment

Raises:
    ValueError: If input validation fails or comment is not found
    RuntimeError: For other errors during reply creation

Inputs: comment_id (required), content (required).

reply_to_postA

Post a reply to an existing Reddit post.

Args:
    post_id: The ID of the post to reply to (can be full URL, permalink, or just ID)
    content: The content of the reply (1-10000 characters)
    subreddit: The subreddit name if known (for validation, with or without 'r/' prefix)

Returns:
    Dictionary containing information about the created reply and parent post

Raises:
    ValueError: If input validation fails or post is not found
    RuntimeError: For other errors during reply creation

Inputs: post_id (required), content (required), subreddit.

search_postsA

Search for Reddit posts using a search query.

Args:
    query: The search query/term to search for
    subreddit: Optional subreddit to limit search to (with or without 'r/' prefix). If None, searches all of Reddit
    sort: Sort order for results - one of: "relevance", "hot", "top", "new", "comments"
    time_filter: Time period to filter results (e.g. "hour", "day", "week", "month", "year", "all")
    limit: Number of posts to return (1-100)

Returns:
    Dictionary containing structured search results with the following structure:
    {
        'query': str,  # The search query used
        'subreddit': Optional[str],  # Subreddit searched (None if searching all of Reddit)
        'sort': str,  # Sort method used
        'time_filter': str,  # Time filter used
        'posts': [  # List of matching posts
            {
                'id': str,  # Post ID
                'title': str,  # Post title
                'author': str,  # Author's username
                'subreddit': str,  # Subreddit name
                'score': int,  # Post score (upvotes - downvotes)
                'upvote_ratio': float,  # Ratio of upvotes to total votes
                'num_comments': int,  # Number of comments
                'created_utc': float,  # Post creation timestamp
                'url': str,  # URL to the post
                'permalink': str,  # Relative URL to the post
                'is_self': bool,  # Whether it's a self (text) post
                'selftext': str,  # Content of self post (if any)
                'link_url': str,  # URL for link posts (if any)
                'over_18': bool,  # Whether marked as NSFW
                'spoiler': bool,  # Whether marked as spoiler
                'stickied': bool,  # Whether stickied in the subreddit
                'locked': bool,  # Whether comments are locked
                'distinguished': Optional[str],  # Distinguishing type (e.g., 'moderator')
                'flair': Optional[Dict],  # Post flair information if any
            },
            ...
        ],
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'result_count': int,  # Number of results returned
            'search_scope': str,  # "all" or subreddit name
        }
    }

Raises:
    ValueError: If query is empty, sort method is invalid, or time_filter is invalid
    RuntimeError: For other errors during the operation

Inputs: query (required), subreddit, sort, time_filter, +1 more.

who_am_iA

Get information about the currently authenticated user.

Returns:
    Dictionary containing structured user information with the following structure:
    {
        'id': str,  # Full user ID (e.g., 't2_abc123')
        'name': str,  # Username
        'created_utc': float,  # Account creation timestamp
        'comment_karma': int,  # Comment karma
        'link_karma': int,  # Post/link karma
        'total_karma': int,  # Total karma (comments + posts)
        'awardee_karma': int,  # Karma from awards received
        'awarder_karma': int,  # Karma from awards given
        'has_verified_email': bool,  # Whether email is verified
        'is_employee': bool,  # Whether user is a Reddit employee
        'is_friend': bool,  # Whether user is a friend
        'is_gold': bool,  # Whether user has Reddit Premium
        'is_mod': bool,  # Whether user is a moderator
        'is_suspended': bool,  # Whether account is suspended
        'verified': bool,  # Whether account is verified
        'has_subscribed': bool,  # Whether user has subscribed to Premium
        'snoovatar_img': str,  # URL to snoovatar image
        'icon_img': str,  # URL to user's icon
        'pref_show_snoovatar': bool,  # Whether to show snoovatar
        'snoovatar_size': Optional[List[int]],  # Snoovatar dimensions
        'subreddit': Optional[Dict],  # User's profile subreddit info
        'metadata': {
            'fetched_at': float,  # Timestamp when data was fetched
            'is_authenticated': bool,  # Whether user is authenticated
            'is_moderator': bool,  # Whether user is a moderator
            'has_verified_email': bool,  # Whether email is verified
            'has_mail': bool,  # Whether user has unread messages
            'has_mod_mail': bool,  # Whether user has mod mail
            'has_subscribed': bool,  # Whether user has subscribed to Premium
            'in_chat': bool,  # Whether user is in chat
            'in_redesign_beta': bool,  # Whether user is in redesign beta
            'new_modmail_exists': bool,  # Whether user has new modmail
            'pref_no_profanity': bool,  # Whether to filter profanity
            'suspension_expiration_utc': Optional[float],  # When suspension ends if suspended
        }
    }

Raises:
    ValueError: If user authentication is not available
    RuntimeError: For other errors during the operation

Inputs: no named parameters.

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 15 tools

    Disambiguation5/5

    Every tool has a clearly distinct purpose with no ambiguity. Tools are well-organized around specific resources (posts, subreddits, users, comments) and actions (create, get, search, join), making it easy for an agent to select the right tool. For example, get_submission_by_id and get_submission_by_url serve the same purpose but through different inputs, which is clear from their names and descriptions.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern with snake_case throughout (e.g., create_post, get_submission_by_id, search_posts). The naming is predictable and readable, with no deviations in style or convention. Tools like get_user_info and who_am_i both retrieve user information but are clearly distinguished by their naming.

    Tool Count5/5

    With 15 tools, the server is well-scoped for a Reddit API, covering core functionalities like posting, retrieving submissions, managing subreddits, and user interactions. Each tool earns its place without feeling excessive or thin, providing comprehensive coverage for typical Reddit workflows without overwhelming an agent.

    Completeness5/5

    The tool set offers complete CRUD/lifecycle coverage for the Reddit domain, including creating posts, retrieving submissions (by ID, URL, search, top posts), managing subreddits (info, stats, joining), user interactions (info, posts, comments), and replying to posts/comments. There are no obvious gaps, and agents can perform end-to-end operations without dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      An MCP server that provides both read-only and authenticated access to Reddit content and interactions without requiring a developer API key. It enables users to browse posts, search subreddits, and perform write actions like commenting and voting by leveraging browser session cookies.
      8
      27 PyPI
      3
      -
    • A
      license
      B
      quality
      D
      maintenance
      An MCP server that provides AI agents with full Reddit API capabilities including search, browsing, reading, posting, commenting, voting, editing, and deleting.
      18
      8 npm
      MIT

    Appeared in Searches