Skip to main content
Glama
raidenrock

USCardForum MCP Server

by raidenrock

get_all_topic_posts

Fetch all posts from a USCardForum topic with automatic pagination, allowing retrieval of entire discussions or specific post ranges.

Instructions

Fetch all posts from a topic with automatic pagination.

Args:
    topic_id: The numeric topic ID
    include_raw: Include markdown source (default: False)
    start_post_number: First post to fetch (default: 1)
    end_post_number: Last post to fetch (optional, fetches to end if not set)
    max_posts: Maximum number of posts to return (optional safety limit)

This automatically handles pagination to fetch multiple batches.

IMPORTANT: For topics with many posts (>100), use max_posts to limit
the response size. You can always fetch more with start_post_number.

Use cases:
- Fetch entire small topic: get_all_topic_posts(topic_id=123)
- Fetch first 50 posts: get_all_topic_posts(topic_id=123, max_posts=50)
- Fetch posts 51-100: get_all_topic_posts(topic_id=123, start_post_number=51, max_posts=50)
- Fetch specific range: get_all_topic_posts(topic_id=123, start=10, end=30)

Returns the same Post structure as get_topic_posts but for all matching posts.

Pro tip: Use get_topic_info first to check post_count before deciding
whether to fetch all or paginate manually.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
topic_idYesThe numeric topic ID
include_rawNoInclude markdown source (default: False)
start_post_numberNoFirst post to fetch (default: 1)
end_post_numberNoLast post to fetch (optional, fetches to end if not set)
max_postsNoMaximum number of posts to return (optional safety limit)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • MCP tool handler decorated with @mcp.tool(). Defines input schema via Pydantic Field annotations and dispatches to the API client's get_all_topic_posts method for execution.
    @mcp.tool()
    def get_all_topic_posts(
        topic_id: Annotated[
            int,
            Field(description="The numeric topic ID"),
        ],
        include_raw: Annotated[
            bool,
            Field(default=False, description="Include markdown source (default: False)"),
        ] = False,
        start_post_number: Annotated[
            int,
            Field(default=1, description="First post to fetch (default: 1)"),
        ] = 1,
        end_post_number: Annotated[
            int | None,
            Field(default=None, description="Last post to fetch (optional, fetches to end if not set)"),
        ] = None,
        max_posts: Annotated[
            int | None,
            Field(default=None, description="Maximum number of posts to return (optional safety limit)"),
        ] = None,
    ) -> list[Post]:
        """
        Fetch all posts from a topic with automatic pagination.
    
        Args:
            topic_id: The numeric topic ID
            include_raw: Include markdown source (default: False)
            start_post_number: First post to fetch (default: 1)
            end_post_number: Last post to fetch (optional, fetches to end if not set)
            max_posts: Maximum number of posts to return (optional safety limit)
    
        This automatically handles pagination to fetch multiple batches.
    
        IMPORTANT: For topics with many posts (>100), use max_posts to limit
        the response size. You can always fetch more with start_post_number.
    
        Use cases:
        - Fetch entire small topic: get_all_topic_posts(topic_id=123)
        - Fetch first 50 posts: get_all_topic_posts(topic_id=123, max_posts=50)
        - Fetch posts 51-100: get_all_topic_posts(topic_id=123, start_post_number=51, max_posts=50)
        - Fetch specific range: get_all_topic_posts(topic_id=123, start=10, end=30)
    
        Returns the same Post structure as get_topic_posts but for all matching posts.
    
        Pro tip: Use get_topic_info first to check post_count before deciding
        whether to fetch all or paginate manually.
        """
        return get_client().get_all_topic_posts(
            topic_id,
            include_raw=include_raw,
            start_post_number=start_post_number,
            end_post_number=end_post_number,
            max_posts=max_posts,
        )
  • Core helper function in TopicsAPI that implements the pagination logic to fetch all (or range of) posts from the forum by repeatedly calling get_topic_posts.
    def get_all_topic_posts(
        self,
        topic_id: int,
        *,
        include_raw: bool = False,
        start_post_number: int = 1,
        end_post_number: int | None = None,
        max_posts: int | None = None,
    ) -> list[Post]:
        """Fetch all posts in a topic with automatic pagination.
    
        Args:
            topic_id: Topic ID
            include_raw: Include raw markdown (default: False)
            start_post_number: Starting post number (default: 1)
            end_post_number: Optional ending post number
            max_posts: Optional maximum posts to fetch
    
        Returns:
            List of all matching posts
        """
        current = max(1, int(start_post_number))
        collected: list[Post] = []
        seen_numbers: set[int] = set()
    
        while True:
            if max_posts is not None and len(collected) >= int(max_posts):
                break
    
            batch = self.get_topic_posts(
                topic_id, post_number=current, include_raw=include_raw
            )
            if not batch:
                break
    
            last_in_batch: int | None = None
            for post in batch:
                pn = post.post_number
                if pn not in seen_numbers:
                    if end_post_number is not None and pn > int(end_post_number):
                        last_in_batch = last_in_batch or pn
                        continue
                    seen_numbers.add(pn)
                    collected.append(post)
                    last_in_batch = pn
                    if max_posts is not None and len(collected) >= int(max_posts):
                        break
    
            if last_in_batch is None:
                break
            current = last_in_batch + 1
            if end_post_number is not None and current > int(end_post_number):
                break
    
        collected.sort(key=lambda p: p.post_number)
        return collected
  • Package-level import of the get_all_topic_posts tool (with other reading tools), making it available for re-export and registration.
    from .topics import (
        get_all_topic_posts,
        get_hot_topics,
        get_new_topics,
        get_top_topics,
        get_topic_info,
        get_topic_posts,
    )
  • Main server entrypoint imports all tools including get_all_topic_posts, which triggers @mcp.tool() decorator registration when executed.
    from uscardforum.server_tools import (
        analyze_user,
        bookmark_post,
        compare_cards,
        find_data_points,
        get_all_topic_posts,
        get_categories,
        get_current_session,
        get_hot_topics,
        get_new_topics,
        get_notifications,
        get_top_topics,
        get_topic_info,
        get_topic_posts,
        get_user_actions,
        get_user_badges,
        get_user_followers,
        get_user_following,
        get_user_reactions,
        get_user_replies,
        get_user_summary,
        get_user_topics,
        list_users_with_badge,
        login,
        research_topic,
        resource_categories,
        resource_hot_topics,
        resource_new_topics,
        search_forum,
        subscribe_topic,
    )
  • Imports Pydantic models (Post for output type, etc.) used for schema validation in the tool's input/output types.
    from uscardforum.models.topics import Post, TopicInfo, TopicSummary
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does an excellent job disclosing key behavioral traits: automatic pagination handling, performance considerations for large topics, safety limits via max_posts, and relationship to sibling tool's return structure. It doesn't mention rate limits or authentication requirements, but provides substantial operational guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, args, pagination note, important warning, use cases, returns, pro tip) and every sentence adds value. It's slightly longer than minimal but efficiently communicates complex functionality. The front-loaded purpose statement immediately conveys the tool's core value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (automatic pagination, multiple filtering parameters) and the presence of an output schema (which handles return value documentation), this description is exceptionally complete. It covers purpose, usage guidelines, parameter interactions, performance considerations, sibling tool relationships, and practical examples - everything needed for effective tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3, but the description adds significant value beyond the schema by explaining parameter interactions and practical usage patterns. The use cases section demonstrates how parameters work together, and the IMPORTANT note clarifies when to use max_posts versus start/end parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verb ('fetch') and resource ('all posts from a topic'), and distinguishes it from sibling 'get_topic_posts' by emphasizing automatic pagination for complete topic retrieval. The title 'get_all_topic_posts' aligns perfectly with this functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives, including: recommending 'get_topic_info first to check post_count before deciding whether to fetch all or paginate manually', suggesting 'max_posts' for topics with many posts (>100), and providing multiple concrete use cases with parameter examples.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/raidenrock/uscardforum-mcp'

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