Slander MCP
An MCP server that finds humorous roasts, jokes, and memes about any character (real or fictional) by searching Twitter/X. Uses social proof (engagement metrics) to rank content, with targeted LLM involvement for query generation, batch quality assessment, and nickname extraction.
Installation
npm install
npm run build
Configuration
Create a .env file with:
# Twitter/X API credentials (required)
TWITTER_BEARER_TOKEN=your_twitter_bearer_token_here
# LLM API key (at least one required)
ANTHROPIC_API_KEY=your_anthropic_api_key_here
# or
OPENAI_API_KEY=your_openai_api_key_here
Usage with Claude Desktop
Add to your Claude Desktop MCP configuration:
{
"mcpServers": {
"slander": {
"command": "node",
"args": ["/path/to/slander_mcp/dist/index.js"],
"env": {
"TWITTER_BEARER_TOKEN": "your_token",
"ANTHROPIC_API_KEY": "your_key"
}
}
}
}
Tools
generate_search_query
Generate effective Twitter search queries for finding slander about a target.
Input:
target(string, required): Name of character to search for
Output:
queries: Array of search query strings
Example:
Input: { "target": "LeBron James" }
Output: { "queries": ["LeBron James ratio", "LeChoke", "LeBron hairline", ...] }
fetch_posts
Fetch posts from Twitter for a given query, looping until quality threshold is met.
Input:
query(string, required): Search queryloop_limit(number, optional): Max fetch iterations (default: 5)count(number, optional): Posts per fetch (default: 10)target(string, optional): Target name for quality evaluation
Output:
posts: Array of post objects with engagement metricsiterations: Number of fetch loopsstopped_reason: "quality_threshold" or "loop_limit"
rank_posts
Rank fetched posts by engagement, separate text from media, extract nicknames.
Input:
posts(array, required): Posts from fetch_poststop_n(number, optional): Results per category (default: 3)target(string, optional): Target name for nickname extraction
Output:
text_posts: Top text posts ranked by engagementmedia_posts: Top media posts ranked by engagementnicknames: Extracted nicknames/slang for the target
Engagement Score Formula:
score = (likes * 1.0) + (retweets * 2.0) + (replies * 0.5)
Example Workflow
-
Generate search queries:
generate_search_query({ target: "LeBron James" }) -
Fetch posts for each query:
fetch_posts({ query: "LeChoke", target: "LeBron James" }) -
Combine and rank results:
rank_posts({ posts: [...all_posts], top_n: 5, target: "LeBron James" })
License
MIT
