Macrocosmos MCP
OfficialProvides tools for querying real-time Reddit data (posts from subreddits and keywords) and creating large-scale data collection tasks for Reddit content.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Macrocosmos MCPFetch 10 tweets about #AI from the last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Macrocosmos MCP
Quickstart with Claude Desktop
Get your API key from Macrocosmos. There is a free tier with $5 of credits to start.
Install
uv(Python package manager), install withcurl -LsSf https://astral.sh/uv/install.sh | shor see theuvrepo for additional install methods.Go to Claude > Settings > Developer > Edit Config > claude_desktop_config.json to include the following:
{
"mcpServers": {
"macrocosmos": {
"command": "uvx",
"args": ["macrocosmos-mcp"],
"env": {
"MC_API": "<insert-your-api-key-here>"
}
}
}
}Related MCP server: MCP Twitter
Available Tools
1. query_on_demand_data - Real-time Social Media Queries
Fetch real-time data from X (Twitter) and Reddit. Best for quick queries up to 1000 results.
Parameters:
Parameter | Type | Description |
| string | REQUIRED. Platform: |
| list | Up to 5 usernames. For X: |
| list | Up to 5 keywords. For Reddit: first item is subreddit (e.g., |
| string | ISO format (e.g., |
| string | ISO format. Defaults to now |
| int | Max results 1-1000. Default: 10 |
| string |
|
Example prompts:
"What has @elonmusk been posting about today?"
"Get me the latest posts from r/bittensor about dTAO"
"Fetch 50 tweets about #AI from the last week"
2. create_gravity_task - Large-Scale Data Collection
Create a Gravity task for collecting large datasets over 7 days. Use this when you need more than 1000 results.
Parameters:
Parameter | Type | Description |
| list | REQUIRED. List of task objects (see below) |
| string | Optional name for the task |
| string | Email for notification when complete |
Task object structure:
{
"platform": "x", // 'x' or 'reddit'
"topic": "#Bittensor", // For X: MUST start with '#' or '$'
"keyword": "dTAO" // Optional: filter within topic
}Important: For X (Twitter), topics MUST start with # or $ (e.g., #ai, $BTC). Plain keywords are rejected.
Example prompts:
"Create a gravity task to collect #Bittensor tweets for the next 7 days"
"Start collecting data from r/MachineLearning about neural networks"
3. get_gravity_task_status - Check Collection Progress
Monitor your Gravity task and see how much data has been collected.
Parameters:
Parameter | Type | Description |
| string | REQUIRED. The task ID from create_gravity_task |
| bool | Include detailed stats. Default: |
Returns: Task status, crawler IDs, records_collected, bytes_collected
Example prompts:
"Check the status of my Bittensor data collection task"
"How many records have been collected so far?"
4. build_dataset - Build & Download Dataset
Build a dataset from collected data before the 7-day completion.
Warning: This will STOP the crawler and de-register it from the network.
Parameters:
Parameter | Type | Description |
| string | REQUIRED. Get from get_gravity_task_status |
| int | Max rows to include. Default: 10000 |
| string | Email for notification when ready |
Example prompts:
"Build a dataset from my Bittensor crawler with 5000 rows"
"I have enough data, build the dataset now"
5. get_dataset_status - Check Build Progress & Download
Check dataset build progress and get download links when ready.
Parameters:
Parameter | Type | Description |
| string | REQUIRED. The dataset ID from build_dataset |
Returns: Build status (10 steps), and when complete: download URLs for Parquet files
Example prompts:
"Is my dataset ready to download?"
"Get the download link for my Bittensor dataset"
6. cancel_gravity_task - Stop Data Collection
Cancel a running Gravity task.
Parameters:
Parameter | Type | Description |
| string | REQUIRED. The task ID to cancel |
7. cancel_dataset - Cancel Build or Purge Dataset
Cancel a dataset build or purge a completed dataset.
Parameters:
Parameter | Type | Description |
| string | REQUIRED. The dataset ID to cancel/purge |
Example Workflows
Quick Query (On-Demand)
User: "What's the sentiment about $TAO on Twitter today?"
→ Uses query_on_demand_data to fetch recent tweets
→ Returns up to 1000 results instantlyLarge Dataset Collection (Gravity)
User: "I need to collect a week's worth of #AI tweets for analysis"
1. create_gravity_task → Returns gravity_task_id
2. get_gravity_task_status → Monitor progress, get crawler_ids
3. build_dataset → When ready, build the dataset
4. get_dataset_status → Get download URL for Parquet fileExample Prompts
On-Demand Queries
"What has the president of the U.S. been saying over the past week on X?"
"Fetch me information about what people are posting on r/politics today."
"Please analyze posts from @elonmusk for the last week."
"Get me 100 tweets about #Bittensor and analyze the sentiment"
Large-Scale Collection
"Create a gravity task to collect data about #AI from Twitter and r/MachineLearning from Reddit"
"Start a 7-day collection of $BTC tweets with keyword 'ETF'"
"Check how many records my gravity task has collected"
"Build a dataset with 10,000 rows from my crawler"
MIT License Made with love by the Macrocosmos team
Available Tools
7 toolsbuild_datasetA
Build a dataset from collected data before the 7-day task completion. Use this when you have enough data and don't want to wait for the full collection period.
WARNING: Building a dataset will STOP the crawler and de-register it from the network. The crawler will no longer collect new data after this operation.
Parameters:
crawler_id (str, REQUIRED): The ID of the crawler to build dataset from (Get this from get_gravity_task_status response - look for 'crawler_ids' field)
max_rows (int, default: 10000): Maximum number of rows to include in the dataset
email (str, optional): Email address for notification when dataset is ready
redirect_url (str, optional): URL to redirect to from the email notification
Returns:
dataset_id: Unique identifier to track the dataset build
Build status and progress information (10 steps total)
Example: build_dataset( crawler_id="crawler-0-multicrawler-9f518ae4-xxxx", max_rows=10000, email="user@example.com" )
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| max_rows | No | ||
| crawler_id | Yes | ||
| redirect_url | No | https://app.macrocosmos.ai/ |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly discloses the critical side effect: building a dataset will stop the crawler, de-register it from the network, and prevent further data collection. It also sets expectations by describing the 10-step build progress.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, usage trigger, warning, parameter list, return values, and example. Every section adds necessary value, and the critical de-registration warning is placed prominently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no annotations, this description is complete. It explains when to use the tool, how to obtain the required parameter, what side effects to expect, what will be returned, and provides a runnable example. An agent has enough information to invoke the tool correctly and decide whether it is safe to proceed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document all parameters, and it fully does. It defines crawler_id, max_rows, email, and redirect_url with their types, defaults, and purposes, and even tells the agent to source crawler_id from get_gravity_task_status's 'crawler_ids' field. The example further clarifies usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Build a dataset from collected data before the 7-day task completion.' It clearly differentiates this from sibling tools like get_dataset_status or cancel_dataset, and the purpose is immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'Use this when you have enough data and don't want to wait for the full collection period.' It does not name a specific alternative tool or state explicit when-not conditions, but the timing guidance and the warning about stopping the crawler provide solid usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_datasetB
Cancel a dataset build or purge a completed dataset.
Parameters:
dataset_id (str, REQUIRED): The ID of the dataset to cancel/purge
Returns:
Success or error message
Example: cancel_dataset(dataset_id="dataset-71e97cfa-xxxx-xxxx-xxxx-33cd91be9028")
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It mentions purge/cancel intent, but does not explain whether purge is irreversible, what permissions are required, what happens to an in-progress build, or other side effects. The generic 'Success or error message' return line adds little behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the primary purpose, and organized into Parameters, Returns, and Example sections. There is no filler or redundant expansion beyond a helpful example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema, the core invocation is covered. However, because there are no annotations and the operation includes a destructive 'purge', the missing side-effect and cancellation-semantics context leaves a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates by defining dataset_id with its type, required status, meaning, and a concrete example. This adds meaningful context beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific resource and actions: 'Cancel a dataset build or purge a completed dataset.' It clearly identifies the target as a dataset, though it does not explicitly contrast with sibling tools like cancel_gravity_task, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the resource: use this when a dataset build needs cancellation or a completed dataset needs purging. However, there is no explicit when/when-not guidance or mention of alternatives such as build_dataset, get_dataset_status, or cancel_gravity_task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_gravity_taskA
Cancel a running Gravity task and stop data collection.
Parameters:
gravity_task_id (str, REQUIRED): The ID of the gravity task to cancel
Returns:
Success or error message
Example: cancel_gravity_task(gravity_task_id="multicrawler-9f518ae4-xxxx-xxxx-xxxx-8b73d7cd4c49")
| Name | Required | Description | Default |
|---|---|---|---|
| gravity_task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses the concrete effect 'stop data collection' and mentions success/error messages, but it does not cover idempotency, permissions, reversibility, whether already-completed tasks can be canceled, or what happens to data collected before cancellation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. The parameter explanation, return line, and example each earn their place without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-required-parameter cancellation tool, the description is nearly complete: it names the effect, documents the parameter, gives an example, and mentions the return type. It lacks only a small amount of behavioral context, such as whether cancellation preserves collected data or requires special permissions, but an agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description documents the single parameter's purpose, marks it required, and provides a concrete example value. This fully compensates for the bare schema in this simple one-parameter case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Cancel') with a specific resource ('a running Gravity task') and adds the effect 'stop data collection.' It is clearly distinguishable from siblings like create_gravity_task and get_gravity_task_status at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a running Gravity task' implies that this tool is for tasks currently in progress, but it does not explicitly say when to prefer this over cancel_dataset or when not to use it. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_gravity_taskA
Create a Gravity task for large-scale data collection from X (Twitter) or Reddit. Use this for collecting large datasets over time (up to 7 days). For quick queries (up to 1000 results), use query_on_demand_data instead.
The task registers on the network within 20 minutes and collects data for 7 days. You'll receive an email notification when the dataset is ready for download.
Parameters:
tasks (List[dict], REQUIRED): List of task objects, each containing:
platform (str): 'x' or 'reddit'
topic (str): The hashtag/subreddit to monitor
For X: MUST start with '#' or '$' (e.g., '#ai', '$BTC') - plain keywords are rejected!
For Reddit: subreddit name (e.g., 'r/MachineLearning')
keyword (str, optional): Additional keyword filter within the topic
Filters posts to only those containing this keyword
Example: topic='#Bittensor', keyword='dTAO' -> only #Bittensor posts mentioning 'dTAO'
name (str, optional): Name for the task (helps organize multiple tasks)
email (str, optional): Email address for notification when dataset is ready
redirect_url (str, optional): URL to redirect to from the email notification
Returns:
gravity_task_id: Unique identifier to track and manage the task
Examples:
Basic collection: create_gravity_task( tasks=[{"platform": "x", "topic": "#ai"}], name="AI Tweets" )
With keyword filter: create_gravity_task( tasks=[{"platform": "x", "topic": "#Bittensor", "keyword": "dTAO"}], name="Bittensor dTAO mentions" )
Multiple platforms: create_gravity_task( tasks=[ {"platform": "x", "topic": "#ai", "keyword": "LLM"}, {"platform": "reddit", "topic": "r/MachineLearning"} ], name="AI Data Collection", email="user@example.com" )
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| No | |||
| tasks | Yes | ||
| redirect_url | No | https://app.macrocosmos.ai/ |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses important asynchronous behavior: the task registers within 20 minutes, collects data for 7 days, sends an email notification, and returns a gravity_task_id. It could also mention costs, cancellation, or failure handling, but the key lifecycle behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, usage distinction, lifecycle, parameter details, returns, and examples. There is minor redundancy—'up to 7 days' appears twice and collection duration is restated—but overall each section earns its place and the examples are valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex asynchronous collection tool with no annotations, the description covers purpose, when to use it, parameter semantics, behavior after invocation, and return value. The output schema exists, so return details need no further expansion. No critical information is missing for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the schema only describes tasks as an array of objects with additionalProperties true. The description fully compensates by documenting the task object structure, platform values ('x' or 'reddit'), topic constraints (#/$ prefix for X, r/ for Reddit), keyword filtering behavior, and all optional parameters with examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Create a Gravity task for large-scale data collection from X (Twitter) or Reddit.' It also differentiates this from query_on_demand_data by contrasting long-running collection (up to 7 days) with quick queries, so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool: 'Use this for collecting large datasets over time (up to 7 days).' It also states an exclusion and routes to the alternative: 'For quick queries (up to 1000 results), use query_on_demand_data instead.' This is clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_statusA
Get the status of a dataset build and download links when ready.
Parameters:
dataset_id (str, REQUIRED): The ID of the dataset to check
Returns:
Build status (Running, Completed, etc.)
Progress steps (10 total steps)
When completed: Download URLs for Parquet files
File metadata (size, row count, expiration date)
Example: get_dataset_status(dataset_id="dataset-71e97cfa-xxxx-xxxx-xxxx-33cd91be9028")
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It clearly describes progress steps, completion state, download URLs, and file metadata, giving a solid picture of how the tool behaves. It does not explicitly state that the operation is read-only or what happens if the build fails, but the status-oriented design is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with Purpose, Parameters, Returns, and Example sections. It is not overly long and each section adds useful information, though the Returns section partly restates the opening sentence about download links.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter status tool, the description covers the essential usage: the required parameter, the return values, and a full example. The existence of an output schema reduces the need to detail every field, and nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides the parameter name and type, but the description fully compensates by describing dataset_id as 'The ID of the dataset to check' and providing a concrete example. This makes the parameter's meaning and format clear despite 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('dataset build') and explicitly includes download links. It distinguishes itself from sibling tools like get_gravity_task_status by focusing on dataset build status. The example reinforces the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for checking build status and fetching download links, but it does not explicitly say when to use it versus alternatives like build_dataset, cancel_dataset, or get_gravity_task_status. The usage context is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gravity_task_statusA
Get the status of a Gravity task and see how much data has been collected.
Parameters:
gravity_task_id (str, REQUIRED): The ID of the gravity task to check
include_crawlers (bool, default: True): Whether to include detailed crawler information Set to True to see records_collected and bytes_collected for each crawler
Returns:
Task status (Running, Completed, Pending, etc.)
Task name and start time
List of crawler IDs (needed for build_dataset)
When include_crawlers=True: records_collected, bytes_collected per crawler
Example: get_gravity_task_status(gravity_task_id="multicrawler-9f518ae4-xxxx-xxxx-xxxx-8b73d7cd4c49")
| Name | Required | Description | Default |
|---|---|---|---|
| gravity_task_id | Yes | ||
| include_crawlers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly indicates this is a read-style operation ('Get the status') and details the conditional behavior of include_crawlers. It doesn't mention auth, rate limits, or error cases, but for a simple status getter the disclosed behavior is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear Parameters, Returns, and Example sections. Each section earns its place, and the example clarifies real usage without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no annotations and a minimal schema, the description provides all necessary operational context: how to invoke it, what the include_crawlers flag changes, what output to expect, and how the result connects to build_dataset. An agent can confidently select and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates. It explains what gravity_task_id refers to, gives the default for include_crawlers, and states the concrete effect of setting it to True (seeing records_collected and bytes_collected per crawler).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Get'), a specific resource ('Gravity task'), and the key insight ('how much data has been collected'). It clearly distinguishes from siblings like get_dataset_status by focusing on Gravity task status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by explaining what the tool returns, and even flags that crawler IDs are needed for build_dataset, implying workflow usage. However, it does not explicitly state when to prefer this tool over alternatives like get_dataset_status or how it relates to create_gravity_task/cancel_gravity_task.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_on_demand_dataA
Fetch real-time social media data from X (Twitter) and Reddit through the Macrocosmos SN13 network. IMPORTANT: This tool requires 'source' parameter to be either 'X' or 'REDDIT' (case-sensitive). Parameters:
source (str, REQUIRED): Data platform - must be 'X' or 'REDDIT'
usernames (List[str], optional): Up to 5 usernames to monitor.
For X: '@' symbol is optional (e.g., ['elonmusk', '@spacex'] both work)
NOT available for Reddit
keywords (List[str], optional): Up to 5 keywords/hashtags to search
For X: any keywords or hashtags (e.g., ['AI', 'crypto', '#bitcoin'])
For Reddit: subreddit names (e.g., ['r/astronomy', 'space']) or 'r/all' for all subreddits
start_date (str, optional): Start date/datetime in YYYY-MM-DD or ISO format
Examples: '2024-04-01' or '2024-01-01T00:00:00Z'
Defaults to 24 hours ago from current time if not specified
end_date (str, optional): End date/datetime in YYYY-MM-DD or ISO format
Examples: '2024-04-25' or '2024-06-03T23:59:59Z'
Defaults to current time if not specified
limit (int, optional): Maximum number of results to return (range: 1-1000, default: 10)
keyword_mode (str, optional): How to match keywords - 'any' (default) or 'all'
'any': returns posts matching ANY of the keywords
'all': returns posts matching ALL of the keywords Default Behavior (when dates not specified): The tool searches the last 24 hours (from current time back to 24 hours ago). Usage Examples:
Get recent tweets from specific users: query_on_demand_data(source='X', usernames=['@elonmusk', '@spacex'], limit=20)
Search tweets by keywords in last 24 hours: query_on_demand_data(source='X', keywords=['AI', 'machine learning'], limit=30)
Monitor specific users AND filter by keywords: query_on_demand_data(source='X', usernames=['@nasa'], keywords=['space', 'mars'], limit=20)
Monitor Reddit subreddits: query_on_demand_data(source='REDDIT', keywords=['r/astronomy', 'space'], limit=50)
Search across all of Reddit with date range: query_on_demand_data(source='REDDIT', keywords=['r/all', 'space'], start_date='2025-04-01', end_date='2025-04-02', limit=50)
Strict keyword matching (requires ALL keywords): query_on_demand_data(source='X', keywords=['AI', 'machine learning'], keyword_mode='all', limit=30)
Precise datetime range search: query_on_demand_data(source='X', keywords=['Bitcoin'], start_date='2024-06-01T00:00:00Z', end_date='2024-06-03T23:59:59Z', limit=100)
Returns: JSON object containing:
status: "success" or error information
data: Array of posts/tweets with full content, user information, engagement metrics, timestamps, platform-specific metadata, and media attachments
meta: Processing statistics (miners queried, response rates, items returned, etc.) Platform-Specific Notes:
X (Twitter): '@' symbol is optional for usernames
Reddit: Does NOT support username filtering, only subreddit/keyword searches
All timestamps returned in UTC format
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| source | Yes | ||
| end_date | No | ||
| keywords | No | ||
| usernames | No | ||
| start_date | No | ||
| keyword_mode | No | any |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels at it. It discloses default date behavior (last 24 hours), limit range and default, keyword_mode semantics, return envelope contents, UTC timestamps, and platform-specific constraints such as username filtering being unavailable for Reddit. No behavioral contradictions or hidden surprises remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized and front-loaded with the most important constraint, but it is somewhat repetitive: the 'Default Behavior' section restates date defaults already given under start_date and end_date, and the examples are more numerous than strictly necessary. Still, each section has a clear purpose and the overall structure aids comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, 7 parameters, no annotations, and 0% schema coverage, the description provides everything needed for correct invocation: required values, supported platforms, parameter semantics, default behavior, return format, and platform-specific limitations. The presence of an output schema further reduces the need to document return values in detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining every parameter: accepted values for source, username limits and @ handling, keyword interpretation per platform, date formats and defaults, limit range, and keyword_mode options. This goes far beyond the bare schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action ('Fetch real-time social media data') and a specific resource ('X and Reddit through the Macrocosmos SN13 network'), and clarifies the exact data platforms involved. It is clearly distinguishable from the sibling tools, which all concern task/dataset creation and cancellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong usage context: required source values, case sensitivity, platform-specific capabilities, and multiple concrete invocation examples. It does not explicitly contrast this tool with alternatives, but the sibling tools are unrelated in function, so this is not a significant gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.2.2- First observed
build_dataset - First observed
cancel_dataset - First observed
cancel_gravity_task - First observed
create_gravity_task - First observed
get_dataset_status - First observed
get_gravity_task_status - First observed
query_on_demand_data
TDQS
Scored across 7 tools
Most tools target distinct resources and actions clearly: on-demand query vs. Gravity task creation are separated by scale and use case, and status/cancel tools are split by resource type. The only mild ambiguity is between query_on_demand_data and create_gravity_task, but their descriptions explicitly clarify quick vs. large-scale collection.
All tools follow a consistent verb_noun snake_case pattern (query_, create_, get_, build_, cancel_). The naming clearly indicates the action and the target resource, making the API predictable and easy to navigate.
Seven tools is well-scoped for the two core workflows: on-demand queries and long-running Gravity data collection with dataset building. Each tool serves a distinct step in the lifecycle without redundancy or bloat.
The core lifecycle is covered: query, create task, check status, build dataset, check status, and cancel either operation. Minor gaps exist such as no listing of existing tasks/datasets and no way to retrieve a completed Gravity dataset directly without building it, but these are workable.
Maintenance
Related MCP Connectors
Twitter/X, Instagram, Reddit & TikTok data for AI agents. Billions of posts. No API keys.
Reddit & X data for AI agents over MCP. Semantic search, hosted, no Reddit API.
X/Twitter reads, search, monitors and posting. Pay-per-call in USDC — no signup, no API keys.
Give your agent live data from Twitter, Reddit, the web and GitHub. No API keys, no scraping stack.
Related MCP Servers
- AlicenseCqualityDmaintenanceAn extensible Model Context Protocol server that provides standardized access to social platform data (currently Farcaster) and onchain data for LLMs.1013MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI models and applications to interact directly with Twitter/X, providing capabilities to create posts, reply to tweets, retrieve user data, and manage account actions.13 npm11MIT
- FlicenseNot gradedqualityDmaintenanceA comprehensive Model Context Protocol (MCP) server that provides tools for interacting with the SocialData API. This server allows you to fetch Twitter/X data, monitor user activity, and analyze social media engagement programmatically.7-

prowlo-mcpofficial
FlicenseNot gradedqualityDmaintenanceEnables AI agents to semantically search and access read-only Reddit and X data through a hosted MCP server, with residential proxy crawling and no API credentials required.-