Skip to main content
Glama
GodisinHisHeaven

USCardForum MCP Server

get_top_topics

Retrieve top-performing forum topics within specified time periods to identify valuable discussions, research important threads, and discover popular content based on engagement scores.

Instructions

Fetch top-performing topics for a specific time period.

Args:
    period: Time window for ranking. Must be one of:
        - "daily": Top topics from today
        - "weekly": Top topics this week
        - "monthly": Top topics this month (default)
        - "quarterly": Top topics this quarter
        - "yearly": Top topics this year
    page: Page number for pagination (0-indexed). Use page=1 to get more topics.

Use this to:
- Find the most valuable discussions in a time range
- Research historically important threads
- Identify evergreen popular content

Returns TopicSummary objects sorted by engagement score.

Example: Use "yearly" to find the most impactful discussions,
or "daily" to see what's trending today.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
periodNoTime window for ranking: 'daily', 'weekly', 'monthly' (default), 'quarterly', or 'yearly'monthly
pageNoPage number for pagination (0-indexed, default: 0)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The primary MCP tool handler for 'get_top_topics', decorated with @mcp.tool(). Defines the input schema using Pydantic's Annotated and Field for parameters 'period' and 'page'. Includes comprehensive docstring. Delegates execution to the underlying DiscourseClient instance via get_client().
    @mcp.tool()
    def get_top_topics(
        period: Annotated[
            str,
            Field(
                default="monthly",
                description="Time window for ranking: 'daily', 'weekly', 'monthly' (default), 'quarterly', or 'yearly'",
            ),
        ] = "monthly",
        page: Annotated[
            int | None,
            Field(default=None, description="Page number for pagination (0-indexed, default: 0)"),
        ] = None,
    ) -> list[TopicSummary]:
        """
        Fetch top-performing topics for a specific time period.
    
        Args:
            period: Time window for ranking. Must be one of:
                - "daily": Top topics from today
                - "weekly": Top topics this week
                - "monthly": Top topics this month (default)
                - "quarterly": Top topics this quarter
                - "yearly": Top topics this year
            page: Page number for pagination (0-indexed). Use page=1 to get more topics.
    
        Use this to:
        - Find the most valuable discussions in a time range
        - Research historically important threads
        - Identify evergreen popular content
    
        Returns TopicSummary objects sorted by engagement score.
    
        Example: Use "yearly" to find the most impactful discussions,
        or "daily" to see what's trending today.
        """
        return get_client().get_top_topics(period=period, page=page)
  • DiscourseClient wrapper method for get_top_topics. Calls the TopicsAPI implementation and enriches the TopicSummary objects with category names using _enrich_with_categories.
    def get_top_topics(
        self, period: str = "monthly", *, page: int | None = None
    ) -> list[TopicSummary]:
        """Fetch top topics for a time period.
    
        Args:
            period: One of 'daily', 'weekly', 'monthly', 'quarterly', 'yearly'
            page: Page number for pagination (0-indexed, default: 0)
    
        Returns:
            List of top topic summaries
        """
        topics = self._topics.get_top_topics(period=period, page=page)
        return self._enrich_with_categories(topics)
  • Low-level TopicsAPI.get_top_topics implementation. Performs HTTP GET to '/top.json' with 'period' and 'page' parameters, validates period, parses JSON response from Discourse API, and constructs list of TopicSummary Pydantic models.
    def get_top_topics(
        self, period: str = "monthly", *, page: int | None = None
    ) -> list[TopicSummary]:
        """Fetch top topics for a time period.
    
        Args:
            period: One of 'daily', 'weekly', 'monthly', 'quarterly', 'yearly'
            page: Page number for pagination (0-indexed, default: 0)
    
        Returns:
            List of top topic summaries
        """
        allowed = {"daily", "weekly", "monthly", "quarterly", "yearly"}
        if period not in allowed:
            raise ValueError(f"period must be one of {sorted(list(allowed))}")
    
        params: dict[str, Any] = {"period": period}
        if page is not None:
            params["page"] = int(page)
    
        payload = self._get(
            "/top.json",
            params=params,
            headers={"Accept": "application/json, text/plain, */*"},
        )
        topics = payload.get("topic_list", {}).get("topics", [])
        return [TopicSummary(**t) for t in topics]
  • Import of get_top_topics from .topics module in server_tools __init__.py, making it available for import from the package.
    from .topics import get_hot_topics, get_new_topics, get_top_topics
    from .search import search_forum
    from .categories import get_categories
    
    # =============================================================================
    # 📖 Reading — Access topic content
    # =============================================================================
    from .topics import get_topic_info, get_topic_posts, get_all_topic_posts
    
    # =============================================================================
    # 👤 Users — Profile & activity research
    # =============================================================================
    from .users import (
        get_user_summary,
        get_user_topics,
        get_user_replies,
        get_user_actions,
        get_user_badges,
        get_user_following,
        get_user_followers,
        get_user_reactions,
        list_users_with_badge,
    )
    
    # =============================================================================
    # 🔐 Auth — Authenticated actions (requires login)
    # =============================================================================
    from .auth import (
        login,
        get_current_session,
        get_notifications,
        bookmark_post,
        subscribe_topic,
    )
    
    # =============================================================================
    # Prompts & Resources
    # =============================================================================
    from .prompts import analyze_user, compare_cards, find_data_points, research_topic
    from .resources import resource_categories, resource_hot_topics, resource_new_topics
    
    
    __all__ = [
        # 📰 Discovery
        "get_hot_topics",
        "get_new_topics",
        "get_top_topics",
  • Import of get_top_topics in server.py entrypoint, exposing the tool for MCP server startup.
    get_top_topics,
Behavior4/5

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

With no annotations provided, the description carries the full burden and adds valuable behavioral context: it discloses that results are sorted by engagement score, includes pagination details (0-indexed, page=1 for more topics), and specifies default values (e.g., 'monthly' as default period). However, it doesn't mention rate limits, authentication needs, or error handling, leaving some gaps.

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

Conciseness5/5

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

The description is well-structured and front-loaded with the core purpose, followed by parameter details, usage guidelines, and examples. Every sentence adds value—no wasted words—and it efficiently communicates necessary information in a compact format.

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 moderate complexity (2 parameters, 100% schema coverage, output schema exists), the description is complete: it covers purpose, parameters with examples, usage scenarios, return behavior (TopicSummary objects sorted by engagement), and distinguishes from siblings. The presence of an output schema means return values don't need explanation, and all gaps are adequately filled.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains the purpose of each period option (e.g., 'daily' for today's trends, 'yearly' for impactful discussions) and clarifies pagination usage ('Use page=1 to get more topics'), enhancing understanding without redundancy.

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 specific action ('fetch top-performing topics') and resource ('topics'), distinguishing it from siblings like 'get_hot_topics' or 'get_new_topics' by emphasizing ranking based on performance over a time period. The opening sentence directly answers what the tool does with precision.

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?

It explicitly provides usage scenarios ('Find the most valuable discussions', 'Research historically important threads', 'Identify evergreen popular content') and examples ('Use "yearly" to find the most impactful discussions, or "daily" to see what's trending today'), giving clear context for when to apply this tool versus alternatives like 'get_hot_topics' for trending content without performance ranking.

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

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