qanon mcp server
Enables search, exploration, and analysis of all QAnon posts for sociological study.
Enables search, exploration, and analysis of all QAnon posts for sociological study.
x000D
x000D
x000D
x000D
x000D
An MCP (Model Context Protocol) server that provides access to a dataset of Q-Anon posts for anthropological/sociological research. This server allows AI assistants like Claude to search, filter, and analyze the Q-Anon drops.x000D
x000D
Posts are drawn from https://github.com/jkingsman/JSON-QAnon. You can learn more about how the source data was composed there, as well as find alternate formats, schemas, etc.x000D
x000D
x000D
x000D
- Python 3.10 or higher_x000D_
- uv
package manager_x000D_
- Claude Desktop (for Claude integration)x000D
x000D
x000D
This tool is compatible with uvx
and does not need to be cloned/installed.x000D
x000D
x000D
To install qanon-mcp-server for Claude Desktop automatically via Smithery:x000D
x000D
bash_x000D_
npx -y @smithery/cli install @jkingsman/qanon-mcp-server --client claude_x000D_
x000D
x000D
x000D
1. Clone or download this repository to your local machine_x000D_
2. Install the required packages using uv
:x000D
x000D
bash_x000D_
uv pip install -e ._x000D_
x000D
x000D
x000D
You can run the server directly with uvx
:x000D
x000D
bash_x000D_
uvx qanon_mcp_x000D_
x000D
x000D
x000D
To use this MCP server with Claude Desktop:x000D
x000D
1. Make sure you have Claude Desktop installed_x000D_
2. Open the Claude menu and select "Settings..."x000D
3. Click on "Developer" in the left-hand bar and then "Edit Config"x000D
4. Add the following configuration to the claude_desktop_config.json
file:x000D
x000D
json_x000D_
{_x000D_
"mcpServers": {_x000D_
"qanon_mcp": {_x000D_
"command": "uvx",_x000D_
"args": [_x000D_
"qanon_mcp"_x000D_
]_x000D_
}_x000D_
}_x000D_
}_x000D_
x000D
x000D
or, if you do not have uvx
installed:x000D
x000D
json_x000D_
{_x000D_
"mcpServers": {_x000D_
"qanon_mcp": {_x000D_
"command": "uv",_x000D_
"args": [_x000D_
"tool",_x000D_
"run",_x000D_
"qanon_mcp"_x000D_
]_x000D_
}_x000D_
}_x000D_
}_x000D_
x000D
x000D
x000D
5. Save the file and restart Claude Desktop_x000D_
6. Start a new conversation in Claude Desktop_x000D_
7. You should see a hammer icon in the input box, indicating that tools are available_x000D_
x000D
x000D
x000D
- qanon://posts/count
- Get the total number of posts_x000D_
- qanon://posts/{post_id}
- Access a specific post by ID_x000D_
- qanon://posts/raw/{post_id}
- Get the raw JSON data for a specific post_x000D_
- qanon://authors
- List all unique authors_x000D_
- qanon://stats
- Get dataset statistics_x000D_
x000D
x000D - get_post_by_id_tool - Retrieve a specific post by its ID_x000D_ - search_posts - Find posts containing specific keywords or phrases_x000D_ - get_posts_by_date - Retrieve posts from a specific date range_x000D_ - get_posts_by_author_id - Find posts by a specific author ID_x000D_ - analyze_post - Get detailed analysis of a specific post including references and context_x000D_ - get_timeline_summary - Generate a chronological timeline, optionally within a date range_x000D_ - word_cloud_by_post_ids - Generate a word frequency analysis for posts within a specified ID range_x000D_ - word_cloud_by_date_range - Generate a word frequency analysis for posts within a specified date range_x000D_ x000D
x000D Once the MCP server is connected to Claude Desktop, you can ask questions like:x000D x000D - "How many Q-Anon posts are in the dataset?"x000D - "Search for posts that mention 'storm'"x000D - "Show me posts from October 2020"x000D - "Analyze post #3725"x000D - "Create a timeline of Q-Anon posts from 2018"x000D - "Generate a word cloud for Q-Anon posts between January and March 2019"x000D - "Get the raw data for post #4500"x000D - "What are the most common words used in posts #1000-2000?"x000D x000D
x000D
- If Claude Desktop does not show the hammer icon, check your configuration and restart Claude Desktop_x000D_
- Ensure the posts.json
file is in the same directory as the script_x000D_
- Check the output in the terminal for any error messages_x000D_
- Make sure you're using the absolute path to the script in your Claude Desktop configuration_x000D_
[
{
"description": " Retrieve a specific post by its ID. Args: post_id: The ID of the post to retrieve ",
"inputSchema": {
"properties": {
"post_id": {
"title": "Post Id",
"type": "integer"
}
},
"required": [
"post_id"
],
"title": "get_post_by_id_toolArguments",
"type": "object"
},
"name": "get_post_by_id_tool"
},
{
"description": " Search for posts/drops containing a specific keyword or phrase. Args: query: The keyword or phrase to search for limit: Maximum number of results to return (default: 10) ",
"inputSchema": {
"properties": {
"limit": {
"default": 10,
"title": "Limit",
"type": "integer"
},
"query": {
"title": "Query",
"type": "string"
}
},
"required": [
"query"
],
"title": "search_postsArguments",
"type": "object"
},
"name": "search_posts"
},
{
"description": " Get posts/drops within a specific date range. Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format (defaults to start_date if not provided) limit: Maximum number of results to return (default: 10) ",
"inputSchema": {
"properties": {
"end_date": {
"default": {
"path": "smithery.yaml",
"type": "blob"
},
"title": "End Date",
"type": "string"
},
"limit": {
"default": 10,
"title": "Limit",
"type": "integer"
},
"start_date": {
"title": "Start Date",
"type": "string"
}
},
"required": [
"start_date"
],
"title": "get_posts_by_dateArguments",
"type": "object"
},
"name": "get_posts_by_date"
},
{
"description": " Get posts/drops by a specific author ID. Args: author_id: The author ID to search for limit: Maximum number of results to return (default: 10) ",
"inputSchema": {
"properties": {
"author_id": {
"title": "Author Id",
"type": "string"
},
"limit": {
"default": 10,
"title": "Limit",
"type": "integer"
}
},
"required": [
"author_id"
],
"title": "get_posts_by_author_idArguments",
"type": "object"
},
"name": "get_posts_by_author_id"
},
{
"description": " Get detailed analysis of a specific post/drop including references and context. Args: post_id: The ID of the post to analyze ",
"inputSchema": {
"properties": {
"post_id": {
"title": "Post Id",
"type": "integer"
}
},
"required": [
"post_id"
],
"title": "analyze_postArguments",
"type": "object"
},
"name": "analyze_post"
},
{
"description": " Get a timeline summary of posts/drops, optionally within a date range. Args: start_date: Optional start date in YYYY-MM-DD format end_date: Optional end date in YYYY-MM-DD format ",
"inputSchema": {
"properties": {
"end_date": {
"default": {
"path": "smithery.yaml",
"type": "blob"
},
"title": "End Date",
"type": "string"
},
"start_date": {
"default": {
"path": "smithery.yaml",
"type": "blob"
},
"title": "Start Date",
"type": "string"
}
},
"title": "get_timeline_summaryArguments",
"type": "object"
},
"name": "get_timeline_summary"
},
{
"description": " Generate a word cloud analysis showing the most common words used in posts within a specified ID range. Args: start_id: Starting post ID end_id: Ending post ID min_word_length: Minimum length of words to include (default: 3) max_words: Maximum number of words to return (default: 100) ",
"inputSchema": {
"properties": {
"end_id": {
"title": "End Id",
"type": "integer"
},
"max_words": {
"default": 100,
"title": "Max Words",
"type": "integer"
},
"min_word_length": {
"default": 3,
"title": "Min Word Length",
"type": "integer"
},
"start_id": {
"title": "Start Id",
"type": "integer"
}
},
"required": [
"start_id",
"end_id"
],
"title": "word_cloud_by_post_idsArguments",
"type": "object"
},
"name": "word_cloud_by_post_ids"
},
{
"description": " Generate a word cloud analysis showing the most common words used in posts within a specified date range. Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format min_word_length: Minimum length of words to include (default: 3) max_words: Maximum number of words to return (default: 100) ",
"inputSchema": {
"properties": {
"end_date": {
"title": "End Date",
"type": "string"
},
"max_words": {
"default": 100,
"title": "Max Words",
"type": "integer"
},
"min_word_length": {
"default": 3,
"title": "Min Word Length",
"type": "integer"
},
"start_date": {
"title": "Start Date",
"type": "string"
}
},
"required": [
"start_date",
"end_date"
],
"title": "word_cloud_by_date_rangeArguments",
"type": "object"
},
"name": "word_cloud_by_date_range"
}
]