qanon mcp server

Local 2025-08-31 23:57:13 0

Enables search, exploration, and analysis of all QAnon posts for sociological study.


QAnon is a dangerous cult. This archive is for research purposes only, and I do not endorse any material in this repo.x000D

x000D

x000D x000D smithery badgex000D 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

Warning: This tool was entirely vibe coded. Use at your own risk.x000D

x000D

Prerequisites_x000D_

x000D - Python 3.10 or higher_x000D_ - uv package manager_x000D_ - Claude Desktop (for Claude integration)x000D x000D

Installation_x000D_

x000D This tool is compatible with uvx and does not need to be cloned/installed.x000D x000D

Installing via Smithery_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

Manual_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

Usage_x000D_

x000D You can run the server directly with uvx:x000D x000D bash_x000D_ uvx qanon_mcp_x000D_x000D x000D

Claude Desktop Integration_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

Features_x000D_

x000D

Resources_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

Tools_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

Example Queries for Claude_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

Troubleshooting_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"
  }
]