Skip to main content
Glama
rafaljanicki

X (Twitter) MCP server

by rafaljanicki

favorite_tweet

Mark a tweet as a favorite on X (Twitter) by providing its unique tweet ID using this tool.

Instructions

Favorites a tweet

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tweet_idYes

Implementation Reference

  • The handler function for the 'favorite_tweet' tool. It performs rate limiting check, initializes the Twitter API client, calls the Tweepy client's like method to favorite the specified tweet, and returns the result.
    @server.tool(name="favorite_tweet", description="Favorites a tweet")
    async def favorite_tweet(tweet_id: str) -> Dict:
        """Favorites a tweet.
    
        Args:
            tweet_id (str): The ID of the tweet to favorite (like).
        """
        if not check_rate_limit("like_actions"):
            raise Exception("Like action rate limit exceeded")
        client, _ = initialize_twitter_clients()
        result = client.like(tweet_id=tweet_id)
        return {"tweet_id": tweet_id, "liked": result.data["liked"]}
  • The @server.tool decorator registers the 'favorite_tweet' function as an MCP tool.
    @server.tool(name="favorite_tweet", description="Favorites a tweet")
  • Helper function to lazily initialize the Tweepy Twitter API v2 Client and v1.1 API, used by favorite_tweet.
    def initialize_twitter_clients() -> tuple[tweepy.Client, tweepy.API]:
        """Initialize Twitter API clients on-demand."""
        global _twitter_client, _twitter_v1_api
    
        if _twitter_client is not None and _twitter_v1_api is not None:
            return _twitter_client, _twitter_v1_api
    
        # Verify required environment variables
        required_env_vars = [
            "TWITTER_API_KEY",
            "TWITTER_API_SECRET",
            "TWITTER_ACCESS_TOKEN",
            "TWITTER_ACCESS_TOKEN_SECRET",
            "TWITTER_BEARER_TOKEN",
        ]
        for var in required_env_vars:
            if not os.getenv(var):
                raise EnvironmentError(f"Missing required environment variable: {var}")
    
        # Initialize v2 API client
        _twitter_client = tweepy.Client(
            consumer_key=os.getenv("TWITTER_API_KEY"),
            consumer_secret=os.getenv("TWITTER_API_SECRET"),
            access_token=os.getenv("TWITTER_ACCESS_TOKEN"),
            access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET"),
            bearer_token=os.getenv("TWITTER_BEARER_TOKEN")
        )
    
        # Initialize v1.1 API for media uploads and other unsupported v2 endpoints
        auth = tweepy.OAuth1UserHandler(
            consumer_key=os.getenv("TWITTER_API_KEY"),
            consumer_secret=os.getenv("TWITTER_API_SECRET"),
            access_token=os.getenv("TWITTER_ACCESS_TOKEN"),
            access_token_secret=os.getenv("TWITTER_ACCESS_TOKEN_SECRET")
        )
        _twitter_v1_api = tweepy.API(auth)
    
        return _twitter_client, _twitter_v1_api
  • Helper function for rate limiting checks, specifically used for 'like_actions' in favorite_tweet.
    def check_rate_limit(action_type: str) -> bool:
        """Check if the action is within rate limits."""
        config = RATE_LIMITS.get(action_type)
        if not config:
            return True  # No limit defined
        counter = rate_limit_counters[action_type]
        now = datetime.now()
        if now >= counter["reset_time"]:
            counter["count"] = 0
            counter["reset_time"] = now + config["window"]
        if counter["count"] >= config["limit"]:
            return False
        counter["count"] += 1
        return True
  • Input schema defined by function signature (tweet_id: str) and docstring, output Dict.
    async def favorite_tweet(tweet_id: str) -> Dict:
        """Favorites a tweet.
    
        Args:
            tweet_id (str): The ID of the tweet to favorite (like).

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/rafaljanicki/x-twitter-mcp-server'

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