glp1forum-mcp
glp1forum-mcp lets you search, browse, and read content from glp1forum.com (a XenForo-based forum focused on GLP-1 medications) via MCP tools. It requires system curl and enforces rate limits (2.5s gap between requests; automatic backoff on 403/429/503).
Search the forum (
search_forum): Full-text search with filters — keywords (AND-matched), forum sections (nodes), author, date range, minimum replies, sort order (relevance, date, replies), and up to 3 pages of results. Category nodes requireincludeChildNodes: true. Results can be grouped by thread.Read thread posts (
get_thread): Retrieve paginated thread content including author, datetime, post body, and permalink. Identify threads by URL orthreadId.Download thread images (
get_thread_images): Opt-in download of full-size image attachments (up to 5 per call) for vision-based reading of image-only content like pricing tables, stock boards, and COA purity figures that are invisible to plain text extraction.Browse a forum section (
list_threads): List threads within a specific section by its numericnodeId, with pagination.Discover forum sections (
list_forums): Get all forum sections and their numericnodeIds, used for targeted searches or thread listings.
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., "@glp1forum-mcpsearch for semaglutide dosage discussions"
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.
glp1forum-mcp
An MCP stdio server that searches and reads https://glp1forum.com (a XenForo forum) with no API keys. It shells out to system curl because Cloudflare there blocks Node's own TLS fingerprint but passes a real curl with a browser User-Agent.
⚠️ The one gotcha
Verified only with Windows curl 8.18 (Schannel). Linux/macOS curl presents a different TLS fingerprint and may get a 403 from Cloudflare. If every request 403s, this is almost certainly why.
Related MCP server: evo-scry
Requirements
Node 18+
System
curlon yourPATH(curl --versionshould work)
Tools
search_forum— full-text search with XenForo filters (keywords, nodes, author, date range, min replies, order, page,maxPagesup to 3). Keywords are AND-matched; category nodes needincludeChildNodes: true.get_thread— read a thread's posts (author, datetime, body, permalink), paginated.get_thread_images— opt-in: download a thread's image attachments at full size as image blocks so vision can read image-only pricing tables / stock boards / COA figures.maxcaps the count (default 4, max 5 — full-size images are token-expensive).list_threads— browse a forum section's thread list bynodeId, paginated.list_forums— list forum sections with their numeric node IDs (feed these tosearch_forum.nodesandlist_threads.nodeId).
Rate limiting
All requests share a global throttle: ≥2.5s between hits. On HTTP 403/429/503 the server backs off 8s plus up to 10s of jitter and retries once; if still blocked it throws glp1forum rate-limited or unavailable (HTTP 503) — wait ~60s before retrying.
The backoff is deliberately much shorter than the ~60s a Cloudflare 503 actually takes to clear: a handler that slept that long would trip the MCP client's own 60s timeout (-32001), and the sleep holds the search mutex. So it fails fast with a retryable error and asks the caller to wait instead — hence "wait ~60s" in the message.
Two env vars tune this:
GLP1_BACKOFF_MS(default8000) — the retry backoff. Raise it if one retry isn't enough.GLP1_INTERVAL_MS(default2500) — the global gap between requests. Raise it for heavy concurrent use; each search costs 2 requests, and 8-way concurrency trips Cloudflare at 2.5s.
Install
Option A — Claude Code plugin marketplace (recommended)
/plugin marketplace add Sedation6612/glp1forum-mcpThen install the glp1forum-mcp plugin. This auto-wires the MCP server; the plugin's config uses ${CLAUDE_PLUGIN_ROOT} so there are no paths to edit.
Option B — Desktop Extension (.mcpb, one-click Claude Desktop)
Download glp1forum-mcp.mcpb from the repo's Releases and double-click it — Claude Desktop
installs it with no paths to edit and no npm install (the server is bundled into a single
dependency-free dist/index.mjs). You still need system curl on your PATH.
Option C — manual (Claude Desktop)
Run npm install && npm run build first, then add to claude_desktop_config.json:
"glp1forum": { "command": "node", "args": ["C:\\path\\to\\glp1forum-mcp\\dist\\index.mjs"] }MSIX Claude Desktop installs put this config under
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\, not plain%APPDATA%.
Build (contributors)
The distributed artifact is a single bundled dist/index.mjs (esbuild). After editing anything
in src/, rebuild and commit dist/:
npm install
npm run build # -> dist/index.mjs (what the plugin & .mcpb run)
npm run pack # build + produce glp1forum-mcp.mcpb for Claude DesktopSelf-test
npm run selftest # or: node src/selftest.jsMakes a few dozen seconds of live requests under the throttle. Failure means curl is being blocked or the site's HTML drifted.
License
All rights reserved (see LICENSE). The source is public for viewing and for contributions back to this repository via pull request. It is not open source — you may not redistribute it or publish your own version. See the LICENSE file for details.
Available Tools
5 toolsget_threadARead-only
Read a thread's posts (paginated) for full context.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Prefer this: pass the url from a search_forum result row. | |
| page | No | Clamped to lastPage. For current status read page 1 then re-fetch page: lastPage — the opening post may be months stale. | |
| threadId | No | Alternative to url. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds pagination behavior beyond the readOnlyHint annotation. It is consistent with the annotation and provides useful context without contradicting it.
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?
Single sentence, 8 words, efficiently communicates purpose and key feature (paginated). No wasted content.
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 rich schema annotations and readOnlyHint, the description provides sufficient high-level context (purpose, pagination). It does not repeat schema details and is adequate for a tool with no output schema.
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 100% with detailed parameter descriptions. The description adds no additional parameter information, so baseline 3 is appropriate.
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 clearly states the tool reads a thread's posts, indicates pagination, and implies obtaining full context. It is distinct from sibling tools like get_thread_images or search_forum.
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?
No explicit guidance on when to use or avoid this tool versus alternatives. The context is implied by the description and sibling names, but no direct comparison or conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thread_imagesARead-only
Opt-in: download a thread's image attachments at full size so their text (pricing tables, per-warehouse stock boards, COA purity figures, payment pages) is readable by vision. Much of the vendor pricing on glp1forum is image-only and invisible to get_thread's text. Returns a summary plus the images as blocks; use max to cap how many download (default 4, max 5). Costs one throttled request per image.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | How many images to download (default 4, capped at 5). Each costs one throttled request and ~4.6k tokens — lower it when you only need the first table. | |
| url | No | Prefer this: pass the url from a search_forum result row. | |
| page | No | Clamped to lastPage. | |
| threadId | No | Alternative to url. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and description adds behavioral details: costs one throttled request per image, token cost (~4.6k per image), default/max for max parameter, and returns summary plus images as blocks. No contradictions.
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?
Two well-structured sentences with every sentence adding value: front-loaded purpose, specific examples, cost info, and parameter guidance. No wasted words.
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 no output schema, description adequately covers return type (summary plus images as blocks), usage context, cost, defaults, and distinguishes from sibling tool get_thread. Complete for a tool with 4 parameters.
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 100%, baseline 3, but description adds significant context: max parameter has default 4, max 5, and cost details; url parameter suggests origin from search_forum result; page is clamped to lastPage; threadId is an alternative to url.
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?
Description explicitly states the tool downloads image attachments at full size for readability via vision, specifies the context (pricing tables, stock boards, etc.), and distinguishes itself from get_thread which only returns text.
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?
Provides clear guidance on when to use ('much of the vendor pricing is image-only and invisible to get_thread's text') and how to cap downloads with max, but does not explicitly state when not to use or list alternatives besides get_thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_forumsARead-only
List forum sections with numeric node IDs (feed these to search_forum.nodes).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description doesn't need to restate. It adds that the tool returns numeric node IDs, which is useful behavioral context. No other traits like pagination or ordering are mentioned, but the tool is simple with no parameters.
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 a single sentence, front-loaded with the core purpose, and every word adds value. No wasted text.
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 list tool with no parameters, the description is complete enough. It states what it does and what it returns. With no output schema, the description provides the output structure implicitly. It could mention if there are any limitations or ordering, but it's adequate.
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?
There are no parameters, and schema coverage is 100% (vacuously). The description adds no param info, but none is needed. Baseline for 0 parameters is 4.
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 clearly states the tool lists forum sections and provides numeric node IDs, which is a specific verb+resource. It distinguishes from siblings like list_threads and search_forum by mentioning the output is used for search_forum.nodes.
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 to feed the node IDs to search_forum.nodes, giving a clear use case. However, it doesn't exclude other uses or contrast with siblings, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_threadsARead-only
Browse a forum section's threads (use list_forums for nodeIds).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| nodeId | Yes | Section ID from list_forums. Never guess one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'browse' aligns with that. The description adds no additional behavioral details beyond the annotation, such as pagination, result limits, or ordering. It is adequate but does not enrich the safety profile.
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 extremely concise: one sentence plus a parenthetical note. Every word adds value, and the key verb 'browse' is front-loaded. There is no redundancy or wasted text.
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?
The description tells the agent how to obtain the nodeId and what the tool does, but it does not describe the output format, pagination, or what fields each thread will contain. With no output schema, this lack of information reduces completeness. It is adequate for a simple list operation but leaves gaps.
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 50% description coverage (nodeId has a description, page does not). The tool description does not mention parameters at all, so it fails to compensate for the missing page parameter description. The nodeId description in the schema is good, but the overall parameter context is lacking.
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 clearly states the tool browses threads in a forum section using the verb 'browse' and resource 'threads'. It distinguishes itself from sibling tool list_forums by noting that list_forums should be used to obtain nodeIds. This is specific and unambiguous.
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 instructs the agent to use list_forums to get valid nodeIds, providing a clear prerequisite. It implies the tool is for browsing all threads in a section, contrasting with search_forum and get_thread siblings. However, it does not explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_forumARead-only
Full-text search glp1forum.com with granular XenForo filters. Multi-word keywords are AND-matched (all terms must appear). Category/parent nodes (e.g. 45 Vendor Connection) return nothing unless includeChildNodes: true. A rate-limit error means wait ~60s before retrying. Result has truncated: true when more result pages exist than were fetched — re-search with a higher maxPages (max 3) to get the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| nodes | No | Section IDs from list_forums. Never guess one — a wrong ID silently returns 0 rows instead of erroring. | |
| order | No | Omit for relevance. "date" (newest first) for any current / latest / in-stock question. "replies" (most-discussed) for reputation, consensus, or what-are-people-saying questions. | |
| author | No | Rarely worth setting. | |
| keywords | Yes | AND-matched: every word must appear. Start with one or two broad terms; if you get 0 hits, drop a term, never add one. | |
| maxPages | No | Clamped 1-3. A result with truncated:true has more pages — re-search with a higher maxPages. | |
| newerThan | No | YYYY-MM-DD. Only to hard-exclude stale rows — order:"date" alone usually suffices, so don't agonize over a cutoff. | |
| olderThan | No | YYYY-MM-DD. Only to hard-exclude rows newer than a cutoff. | |
| minReplies | No | Rarely worth setting. | |
| searchType | No | Omit (= "post") so a keyword buried in a reply still matches. "thread" matches only titles/opening posts. | |
| titlesOnly | No | Rarely worth setting. | |
| groupByThread | No | true collapses results to one row per thread. Omitting searchType plus groupByThread:true is the discovery default. | |
| includeChildNodes | No | Set true when nodes names a parent/category section: those hold no posts of their own and return 0 rows if searched alone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behaviors beyond annotations: rate-limiting with a recommended wait, silent failure when using a wrong node ID (returns 0 rows), and the truncated flag indicating incomplete results. These details are critical for an agent to invoke the tool correctly. Annotations only provide readOnlyHint=true, which is consistent with the read-only search operation.
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 but somewhat verbose, containing multiple sentences that each provide distinct value. It could be slightly more concise by grouping related guidelines, but it remains clear and front-loaded with essential information. No wasted sentences.
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 complexity (13 parameters, no output schema), the description is remarkably complete. It covers rate-limit handling, the truncated field in results, and common pitfalls like wrong node IDs. It also provides best practices for keyword usage and ordering. No output schema exists, so the description's coverage of result behavior compensates well.
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?
Despite high schema coverage (92%), the description adds substantial meaning beyond the schema. For example, it explains the AND-matching logic for keywords, the behavior of nodes with includeChildNodes, and the semantics of order values ('date' for latest, 'replies' for most-discussed). It also clarifies when to omit parameters (e.g., order for relevance). This adds value for agent comprehension.
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 clearly states 'Full-text search glp1forum.com with granular XenForo filters', specifying the domain and type of search. This verb+resource combination is distinct from sibling tools like get_thread or list_forums, which are for retrieval or listing, not full-text search.
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 provides explicit when-to-use guidance: it explains AND-matching for keywords, the need for includeChildNodes when searching category nodes, rate-limit retry behavior, and handling truncated results. It also advises on using the order parameter for different query types, such as 'date' for current topics and 'replies' for consensus. While it doesn't explicitly exclude sibling tools, the context is sufficient given their distinct purposes.
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.
4 tool updates
v0.5.0- Changed
get_thread3 fields changed- added
Input schema / properties / page / descriptionAdded value: +"Clamped to lastPage. For current status read page 1 then re-fetch page: lastPage — the opening post may be months stale." - added
Input schema / properties / threadId / descriptionAdded value: +"Alternative to url." - added
Input schema / properties / url / descriptionAdded value: +"Prefer this: pass the url from a search_forum result row."
- Changed
get_thread_images4 fields changed- added
Input schema / properties / max / descriptionAdded value: +"How many images to download (default 4, capped at 5). Each costs one throttled request and ~4.6k tokens — lower it when you only need the first table." - added
Input schema / properties / page / descriptionAdded value: +"Clamped to lastPage." - added
Input schema / properties / threadId / descriptionAdded value: +"Alternative to url." - added
Input schema / properties / url / descriptionAdded value: +"Prefer this: pass the url from a search_forum result row."
- Changed
list_threads1 field changed- added
Input schema / properties / nodeId / descriptionAdded value: +"Section ID from list_forums. Never guess one."
- Changed
search_forum13 fields changed- added
Input schema / properties / author / descriptionAdded value: +"Rarely worth setting." - added
Input schema / properties / groupByThread / descriptionAdded value: +"true collapses results to one row per thread. Omitting searchType plus groupByThread:true is the discovery default." - added
Input schema / properties / includeChildNodes / descriptionAdded value: +"Set true when nodes names a parent/category section: those hold no posts of their own and return 0 rows if searched alone." - added
Input schema / properties / keywords / descriptionAdded value: +"AND-matched: every word must appear. Start with one or two broad terms; if you get 0 hits, drop a term, never add one." - added
Input schema / properties / maxPages / descriptionAdded value: +"Clamped 1-3. A result with truncated:true has more pages — re-search with a higher maxPages." - added
Input schema / properties / minReplies / descriptionAdded value: +"Rarely worth setting." - added
Input schema / properties / newerThan / descriptionAdded value: +"YYYY-MM-DD. Only to hard-exclude stale rows — order:\"date\" alone usually suffices, so don't agonize over a cutoff." - added
Input schema / properties / nodes / descriptionAdded value: +"Section IDs from list_forums. Never guess one — a wrong ID silently returns 0 rows instead of erroring." - added
Input schema / properties / olderThan / descriptionAdded value: +"YYYY-MM-DD. Only to hard-exclude rows newer than a cutoff." - added
Input schema / properties / order / descriptionAdded value: +"Omit for relevance. \"date\" (newest first) for any current / latest / in-stock question. \"replies\" (most-discussed) for reputation, consensus, or what-are-people-saying questions." - removed
Input schema / properties / prefixesRemoved value: -{ - "items": { - "type": "number" - }, - "type": "array" -} - added
Input schema / properties / searchType / descriptionAdded value: +"Omit (= \"post\") so a keyword buried in a reply still matches. \"thread\" matches only titles/opening posts." - added
Input schema / properties / titlesOnly / descriptionAdded value: +"Rarely worth setting."
5 tool updates
v0.3.0- First observed
get_thread - First observed
get_thread_images - First observed
list_forums - First observed
list_threads - First observed
search_forum
TDQS
Scored across 5 tools
Each tool has a clear and distinct purpose: listing forums, listing threads, reading a thread's posts, downloading images, and searching. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case (list_forums, list_threads, get_thread, get_thread_images, search_forum), making the set predictable.
With 5 tools, the server covers browsing, reading, and searching a forum without being excessive or insufficient. The count feels well-scoped for the domain.
The tool set provides a complete read-oriented interface for the forum: navigating sections, listing threads, reading posts with pagination, accessing images, and full-text search. No obvious gaps for a read-only use case.
Maintenance
Related MCP Connectors
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Serper MCP — wraps the Serper Google Search API (serper.dev)
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for using various search tools like Tavily API. Planning to support various search tools (i.e. wiki search, searxng, etc)3MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for internet search via direct Google and DuckDuckGo HTML scraping with AI-powered result normalization and optional summarization, requiring no API keys for search.MIT
- FlicenseNot gradedqualityCmaintenanceAn experimental MCP server that provides web search capabilities using the Tavily API. Still in progress, not production-ready.-
- AlicenseAqualityBmaintenanceMCP server for Flarum forums that enables searching, reading, and posting discussions through Flarum's REST API.75 npmMIT