Skip to main content
Glama
GodisinHisHeaven

USCardForum MCP Server

subscribe_topic

Set notification preferences for USCardForum topics to control when you receive alerts. Choose from muted, normal, tracking, or watching levels to manage forum updates.

Instructions

Set your notification level for a topic. REQUIRES AUTHENTICATION.

Args:
    topic_id: The topic ID to subscribe to
    level: Notification level:
        - 0: Muted (no notifications)
        - 1: Normal (only if mentioned)
        - 2: Tracking (notify on replies to your posts)
        - 3: Watching (notify on all new posts)

Must call login() first.

Returns a SubscriptionResult with:
- success: Whether subscription succeeded
- notification_level: The new notification level

Use to:
- Watch topics for all updates (level=3)
- Mute noisy topics (level=0)
- Track topics you've contributed to (level=2)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
topic_idYesThe topic ID to subscribe to
levelNoNotification level: 0=muted, 1=normal, 2=tracking (default), 3=watching

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
successYesWhether subscription succeeded
notification_levelNoNew notification level

Implementation Reference

  • MCP tool handler for 'subscribe_topic'. Decorated with @mcp.tool(), includes input schema via Annotated[Field] parameters for topic_id (int) and level (int, default 2), detailed docstring, returns SubscriptionResult, delegates to get_client().subscribe_topic() which handles the actual API call.
    @mcp.tool()
    def subscribe_topic(
        topic_id: Annotated[
            int,
            Field(description="The topic ID to subscribe to"),
        ],
        level: Annotated[
            int,
            Field(
                default=2,
                description="Notification level: 0=muted, 1=normal, 2=tracking (default), 3=watching",
            ),
        ] = 2,
    ) -> SubscriptionResult:
        """
        Set your notification level for a topic. REQUIRES AUTHENTICATION.
    
        Args:
            topic_id: The topic ID to subscribe to
            level: Notification level:
                - 0: Muted (no notifications)
                - 1: Normal (only if mentioned)
                - 2: Tracking (notify on replies to your posts)
                - 3: Watching (notify on all new posts)
    
        Must call login() first.
    
        Returns a SubscriptionResult with:
        - success: Whether subscription succeeded
        - notification_level: The new notification level
    
        Use to:
        - Watch topics for all updates (level=3)
        - Mute noisy topics (level=0)
        - Track topics you've contributed to (level=2)
        """
        return get_client().subscribe_topic(topic_id, level=level)
  • Core implementation in AuthAPI.subscribe_topic(). Performs the HTTP POST request to /t/{topic_id}/notifications with notification_level, handles CSRF token, requires authentication, returns SubscriptionResult(success=True). Called by client.subscribe_topic().
    def subscribe_topic(
        self,
        topic_id: int,
        level: NotificationLevel = NotificationLevel.TRACKING,
    ) -> SubscriptionResult:
        """Set topic notification level (requires auth).
    
        Args:
            topic_id: Topic ID
            level: Notification level (MUTED, NORMAL, TRACKING, WATCHING)
    
        Returns:
            Subscription result
        """
        self._require_auth()
        if not isinstance(level, NotificationLevel):
            level = NotificationLevel(level)
    
        token = self._csrf_token or self.fetch_csrf_token()
    
        headers = {
            "Accept": "*/*",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "X-CSRF-Token": token,
            "X-Requested-With": "XMLHttpRequest",
            "Referer": f"{self._base_url}/t/{int(topic_id)}",
        }
    
        self._post(
            f"/t/{int(topic_id)}/notifications",
            data={"notification_level": str(int(level))},
            headers=headers,
        )
    
        return SubscriptionResult(success=True, notification_level=level)
  • Client wrapper method DiscourseClient.subscribe_topic() that converts level to NotificationLevel enum and delegates to self._auth (AuthAPI).subscribe_topic().
    def subscribe_topic(
        self,
        topic_id: int,
        level: int = 2,
    ) -> SubscriptionResult:
        """Set topic notification level (requires auth).
    
        Args:
            topic_id: Topic ID
            level: 0=muted, 1=normal, 2=tracking, 3=watching
    
        Returns:
            Subscription result
        """
        return self._auth.subscribe_topic(topic_id, level=NotificationLevel(level))
  • Re-export of subscribe_topic from server_tools.auth into the server_tools package, making it available for import in server.py.
    from .auth import (
        login,
        get_current_session,
        get_notifications,
        bookmark_post,
        subscribe_topic,
    )
  • Import of subscribe_topic (among other tools) from server_tools in the main FastMCP server entrypoint. Importing the @mcp.tool()-decorated function registers it as an MCP tool.
    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,
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 of behavioral disclosure. It effectively describes authentication requirements ('REQUIRES AUTHENTICATION'), the mutation nature of setting notification levels, and the return structure. However, it doesn't mention potential side effects like rate limits or error conditions.

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 with clear sections (purpose, args, prerequisites, returns, use cases). Every sentence adds value without redundancy. It's front-loaded with the core purpose and efficiently organized for quick comprehension.

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, mutation operation) and the presence of an output schema (returns SubscriptionResult), the description provides complete context. It covers authentication needs, parameter semantics, return values, and practical use cases, leaving no significant gaps for the agent.

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 value by explaining the semantic meaning of each level value with clear examples (0=muted, 1=normal, etc.), which goes beyond the schema's basic enumeration. It also clarifies that topic_id is required and level has a default of 2.

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 starts with a specific verb ('Set') and resource ('notification level for a topic'), clearly stating what the tool does. It distinguishes from siblings like get_topic_info or get_topic_posts by focusing on subscription management rather than information retrieval.

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 explicitly states 'Must call login() first' for authentication prerequisites and provides clear use cases with specific level values (e.g., 'Watch topics for all updates (level=3)', 'Mute noisy topics (level=0)'). It distinguishes when to use this tool versus alternatives by focusing on subscription actions.

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