nodebb-mcp
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., "@nodebb-mcpsearch the forum for the login loop bug and whether it's resolved"
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.
nodebb-mcp
An MCP server for investigating issues and finding answers on a NodeBB forum.
Point it at a forum and it searches the forum's own history, extracts the answers that already exist, and says what is still open — so a question gets answered from what the community already worked out rather than from guesswork.
It integrates with two optional NodeBB plugins for sharper results, and works without either of them.
Install
npm install && npm run buildRelated MCP server: Discourse MCP
Configure
Variable | Required | Default | Purpose |
| yes | — | Forum root, e.g. |
| no | — | Bearer token from ACP → Settings → API Access. Without it the server sees only publicly readable content |
| no | — | Acting uid. Required when the token is a master token; ignored for user tokens |
| no |
| Per-request timeout |
| no |
| Cap on posts pulled per topic |
| no |
| How long plugin detection is cached |
| no |
| Plugin id namespace under |
Add it to an MCP client:
{
"mcpServers": {
"nodebb": {
"command": "node",
"args": ["/path/to/nodebb-mcp/dist/index.js"],
"env": {
"NODEBB_URL": "https://forum.example.com",
"NODEBB_API_TOKEN": "your-token"
}
}
}
}Tools
Answering
Tool | Does |
| Find topics that already answer a question and extract the answer from each |
| Full sweep on a problem report: existing answers, still-open reports, triage state, next steps |
| The answer to one topic — accepted if Q&A is installed, best reply otherwise |
| The queue of questions nobody has answered |
Reading
Tool | Does |
| Full-text search with snippets |
| A thread in full, accepted answer and triage status marked |
| One post with its topic |
| Category tree with ids |
| recent / popular / top / unread listings |
Triage
Tool | Does |
| Is anyone working on this topic, and was it resolved |
| The team's board by workflow column |
Diagnostics
Tool | Does |
| Which features are live on this forum, and what is missing |
Two prompts, answer_forum_question and investigate_report, encode the usual
tool order for each workflow.
Optional integrations, and life without them
Everything is probed against the live forum at startup and re-probed on a TTL. Nothing here is required; a missing plugin is a normal state that every tool degrades around and states in its own output, so a thin answer is never mistaken for a confident one.
Integration | Probe | With it | Without it |
Search plugin (e.g. |
| Real relevance ranking over titles and post bodies | Falls back to scanning recent-topic listings and ranking titles by term overlap; says it can only see recent activity |
|
| Author-accepted answers; a real unsolved queue; solved markers on results | Uses the most-upvoted reply, explicitly labelled not marked accepted; approximates the queue with reply-less topics |
Shotef triage |
| Workflow stage, handling team, parked/closed reasons | Reports triage as unknowable here and points you at the thread itself |
NodeBB core ships no search of its own — its search controller 404s unless a
plugin listens on filter:search.query — which is why search is treated as
optional rather than assumed.
The rule the tools follow: an unconfirmed reply is never presented as an accepted
answer. find_answers always labels its basis (accepted answer,
most-upvoted reply (not marked accepted), first reply), and
get_topic_answer on an open question reports it as genuinely unanswered instead
of guessing.
Development
npm run build # compile to dist/
npm test # 67 tests, no forum required
npm run check # typecheck + testsTests run against a fake NodeBB over real HTTP (tests/fake-forum.js) that
reproduces the shapes that actually bite — HTML-escaped titles, rendered-HTML post
bodies, the { status, response } envelope, and a 404 on /api/search when no
search plugin is installed. Plugins are switchable per test, so the degradation
paths are exercised directly: tests/degradation.test.js runs the whole tool
surface against a forum with none of them. tests/tools.test.js drives a real MCP
client against a real server over an in-memory transport.
resources/ — NodeBB plugin-authoring knowledge base
Ten markdown documents covering how to build a NodeBB plugin (v3/v4), plus
resources/index.json, a manifest mapping each document to an MCP resource URI
so the server can serve them verbatim.
URI | File | Covers |
|
| Mental model, plugin anatomy, the five rules, triage |
|
|
|
|
|
|
|
| Page routes, |
|
| The |
|
| Client scripts, ACP modules, |
|
| 16 traps as symptom → cause → fix |
|
|
|
|
| Scaffolding, dev environment, reusable snippets |
|
| Annotated tour of a real ~5,200-line plugin |
Manifest shape
{
"uri": "nodebb://plugin-dev/gotchas",
"name": "nodebb-plugin-gotchas",
"title": "Gotchas — the hours-eaters",
"description": "…",
"mimeType": "text/markdown",
"path": "60-gotchas.md",
"keywords": ["gotchas", "debugging", "…"]
}uri, name, title, description, and mimeType are the fields an MCP
resources/list response needs. path is relative to resources/index.json and
tells the server what to read for resources/read. keywords is extra, for
search or tool-side filtering.
Reading the manifest is a few lines in any language, for example:
const manifest = require('./resources/index.json');
const listResources = () => manifest.resources.map(
({ uri, name, title, description, mimeType }) => ({ uri, name, title, description, mimeType })
);
const readResource = (uri) => {
const entry = manifest.resources.find(r => r.uri === uri);
if (!entry) throw new Error(`unknown resource: ${uri}`);
return {
contents: [{
uri,
mimeType: entry.mimeType,
text: fs.readFileSync(path.join(__dirname, 'resources', entry.path), 'utf8'),
}],
};
};Provenance
Distilled from nodebb-plugin-shotef
— its .claude/skills/nodebb-plugin-dev/ skill, its CLAUDE.md, its dev/
tooling, and its plugin source (~5,200 lines across library.js, lib/,
public/js/, templates/, and 18 node:test files).
Everything here was verified against NodeBB v4.x on Node 22 with Redis; most of it applies to v3 as well.
Maintaining
The documents are plain markdown with no build step. To add one: write the file
in resources/, then add an entry to resources/index.json. Keep the numeric
filename prefixes — they give the corpus a reading order.
Available Tools
12 toolsfind_answersFind existing answersARead-only
Find topics that already answer a question, and extract the answer from each. Prefers author-accepted answers when the Q&A plugin is installed, and falls back to the strongest reply otherwise — always labelling which it used, so an unconfirmed reply is never presented as a confirmed answer. This is the first tool to reach for when someone asks a question the forum may have seen before.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only topics carrying all of these tags. | |
| depth | No | How many candidate topics to open and extract answers from. Default 5. | |
| question | Yes | The question, in natural language. | |
| categories | No | Restrict to these category ids. | |
| solved_only | No | Only return topics with an accepted answer. Requires the Q&A plugin; ignored without it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds substantial behavioral context: it prefers author-accepted answers when the Q&A plugin is installed, falls back to the strongest reply otherwise, and always labels which approach it used so unconfirmed replies are not presented as confirmed answers. This is exactly the kind of source-quality and fallback disclosure an agent needs beyond safety hints.
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?
Three sentences with zero waste, front-loading the core action and then adding the important fallback and routing context. Every sentence earns its place.
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 covers purpose, preferred usage, fallback behavior, and plugin dependency well, and annotations cover safety. With no output schema, it could say more about the shape of the extracted answer or how results are structured, but it does signal that each answer is labelled by source, which is likely enough 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?
Schema description coverage is 100%, so all five parameters are already documented in the schema. The description does not add parameter-level meaning such as what depth controls or how category/tag filters combine, so the baseline score of 3 applies.
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?
States a specific verb and resource ('Find topics that already answer a question, and extract the answer from each') and distinguishes itself from siblings by positioning as the first tool to reach for when a question may have been seen before. It also clarifies Q&A-plugin-dependent behavior, which helps differentiate it from generic search tools.
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 to reach for this first when someone asks a question the forum may have seen before, giving clear context for use. It does not name alternatives to avoid or state when-not-to-use conditions, so it stops short of a full routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forum_capabilitiesForum capabilitiesARead-only
Report which forum features this server can actually use: reachability, authentication, full-text search, the Q&A plugin (accepted answers), and the Shotef triage plugin. Call this first when a result looks thin or a tool reports a feature as unavailable — it explains what is missing and what would enable it.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Re-probe the forum instead of using the cached result. Use after installing a plugin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond them: the specific capabilities probed and the fact that the response explains what is missing and what would enable it. It does not mention cost or latency of probing, which keeps it short of a 5.
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 sentences, no filler. The capability list comes first and the routing guidance second, which is the correct front-loading for a diagnostic tool.
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?
With no output schema, the description carries the burden of describing the return value, and it does so at a useful level: per-feature usability plus an explanation of what is missing and what would enable it. Slightly more detail on the response shape (e.g. per-feature status fields) would make it fully self-contained.
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?
Only one parameter (refresh) and schema description coverage is 100%, with the schema itself explaining the caching behavior and the post-plugin-install use case. The description adds nothing about the parameter, so the baseline 3 applies.
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?
States a specific verb (Report) and resource (forum features this server can use), then enumerates exactly what is probed: reachability, authentication, full-text search, the Q&A plugin, and the Shotef triage plugin. This clearly separates it from siblings like search_forum or get_triage_status, which consume features rather than diagnose them.
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?
Gives explicit trigger conditions: call it first when a result looks thin, or when a tool reports a feature as unavailable. That is strong when-to-use guidance, though it does not state when not to bother (e.g. after a successful call) or name alternative diagnostics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_postRead a single postARead-only
Read one post by its id, with the topic it belongs to. Use when a search result or a link points at a specific reply and you only need that reply.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | Yes | Post id (the number in /post/<pid>). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully notes that the parent topic is returned alongside the post, but says nothing about behavior on an invalid or deleted pid, nor about the result shape. Adds modest value over the annotations, not rich behavioral context.
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 short sentences, front-loaded with the action and the return scope, then the usage condition. Every clause earns its place with no redundancy.
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 read tool with no output schema, the description covers the input, the return scope (post plus topic), and the use case. It is close to complete; only error/edge-case behavior is left unstated, which is minor here.
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 100% and the single pid parameter is fully documented in the schema, including the /post/<pid> format and an exclusiveMinimum constraint. The description only restates 'by its id' and adds no syntax or constraint detail, so the baseline 3 applies.
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?
States a specific verb and resource ('Read one post by its id') and adds scope by noting the parent topic is included. It implicitly separates itself from get_topic and search_forum by emphasizing a single reply, though it never names those siblings outright.
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?
Gives a concrete trigger condition: 'when a search result or a link points at a specific reply and you only need that reply.' That distinguishes the single-post case from browsing, but it does not explicitly name get_topic as the alternative when the topic itself is wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topicRead a topicARead-only
Read a topic in full: the original post, replies in order, and — when the relevant plugins are installed — which reply is the accepted answer and where the topic sits on the triage board. This is the tool for understanding a reported issue in the reporter's own words.
| Name | Required | Description | Default |
|---|---|---|---|
| tid | Yes | Topic id (the number in /topic/<tid>/...). | |
| page | No | Page of posts, for long topics. | |
| max_posts | No | Cap on posts returned. Default comes from server config (50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuine behavioral context beyond that: the accepted-answer and triage-board fields are conditional on installed plugins, so the agent knows the response shape can vary. It does not mention pagination behavior, which the schema partly hints at.
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 sentences, zero filler, and the payload enumeration is front-loaded before the soft usage note. Every clause earns its place.
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?
With no output schema, the description carries the burden of describing return contents, and it does so well (post, replies, accepted answer, triage position). Minor gaps: pagination interaction with page/max_posts and behavior on invalid tid are left unstated.
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 100% and each of the three parameters (tid, page, max_posts) is documented with format/default context in the schema. The description adds nothing about parameters, so the baseline 3 applies.
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?
States a specific verb (read) and resource (topic) and enumerates what 'in full' means: original post, replies in order, accepted answer, triage position. It implicitly distinguishes itself from get_post (single post) and get_topic_answer (just the answer) by promising the whole thread, though it never names those siblings explicitly.
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 closing sentence gives a use case ('understanding a reported issue in the reporter's own words'), which implies when to reach for it. But there is no explicit when-not guidance and no routing to the obvious alternatives (get_post, get_topic_answer, investigate_issue), so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topic_answerGet a topic's answerARead-only
Get the answer to one specific topic. With the Q&A plugin this is the accepted answer, and an open question is reported as genuinely unanswered rather than guessed at. Without it, returns the most-upvoted reply, labelled as unconfirmed.
| Name | Required | Description | Default |
|---|---|---|---|
| tid | Yes | Topic id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and openWorldHint, so safety is covered. The description goes beyond that by disclosing two behavioral modes contingent on plugin presence (accepted answer vs. most-upvoted unconfirmed reply) and a no-guess policy for open questions – genuinely useful context an agent cannot get from annotations.
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 tight sentences, front-loaded with the core purpose and then the plugin-dependent behavioral nuance. No filler.
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 single-param read tool, the description covers purpose and the main behavioral contingency (plugin presence) that influences the returned content. No output schema exists, but the description does explain the nature of the returned answer, which compensates; a note on error handling for missing topics would complete it.
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?
Single required 'tid' integer with 100% schema coverage including 'Topic id.' and exclusiveMinimum. The description adds no syntax, format, or boundary detail beyond the schema, so the baseline of 3 applies.
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?
Clear verb+resource: retrieves the answer for a specific topic by id. It does not explicitly differentiate itself from siblings like get_post or find_answers, but the 'topic's answer' scope is specific enough to distinguish from a generic post fetch.
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?
Implied usage is 'fetch the answer for a known topic id', but the description gives no explicit when-to-use versus find_answers or get_topic, nor any preconditions. An agent can infer the context but is not guided to the alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_triage_boardGet the triage boardARead-only
The team's triage board: every open ticket by workflow column, with priority, owner and age. Use it to see the current support workload, or to find which issues are stalled. Requires the Shotef plugin and a token belonging to a team member — a non-member gets an explanation rather than an error.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Team id. Omit for the token holder's default team. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value beyond that: it discloses the Shotef plugin dependency, the team-member token requirement, and the non-obvious fact that a non-member receives an explanation rather than an error. It stops short of describing pagination or result size limits.
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?
Three tight sentences: what the board is, what it's for, and what it requires. The resource definition is front-loaded and every sentence earns its place.
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 zero-required-parameter read tool with no output schema, the description covers content, purpose, prerequisites, and failure behavior. Nothing needed to call it correctly is missing.
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 100% and the single parameter's omission/default behavior is already documented in the schema ('Omit for the token holder's default team'). The description adds no syntax or semantics beyond that, so the baseline 3 applies.
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?
States a specific resource and enumerates exactly what the result contains ('every open ticket by workflow column, with priority, owner and age'). This level of detail separates it cleanly from siblings like get_triage_status and investigate_issue without needing to name them.
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?
Names two concrete use cases: seeing current support workload and finding stalled issues. Clear context for invocation, but offers no explicit exclusions or alternative tools (e.g. when to prefer get_triage_status over this board).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_triage_statusGet triage statusARead-only
Where a topic stands in the support workflow: received, in progress, awaiting the reporter, or closed — plus which team handles it and whether it is parked. Answers "is anyone working on this, and was it ever resolved?". Requires the Shotef triage plugin; without it, reports that cleanly and suggests reading the topic instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tid | Yes | Topic id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnlyHint and openWorldHint, and the description adds genuinely new behavioral context: a hard dependency on the Shotef triage plugin and a graceful failure mode (reports cleanly and redirects to reading the topic). It does not address auth or caching, but for a read-only status lookup this is solid added value.
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?
Three tightly written sentences, front-loaded with the returned states, then the question answered, then the plugin caveat. Every sentence earns its place; density is justified by the lack of an output schema.
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?
Without an output schema, the description must carry the return contract, and it does: enumerates the state values plus team and parked status. The plugin dependency and failure behavior close the remaining operational 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 coverage is 100% with a single documented tid parameter, so the schema carries the semantics. The description adds no identifier format or validity guidance, making 3 the appropriate baseline.
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?
States a specific verb+resource (triage status of a topic) and enumerates the exact payload: workflow states (received, in progress, awaiting the reporter, closed), the handling team, and the parked flag. This lets an agent distinguish it from siblings like get_topic or get_triage_board without opening any schema.
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?
Frames the use case crisply with the question it answers ('is anyone working on this, and was it ever resolved?') and names the fallback when the plugin is absent (read the topic instead). It stops short of contrasting itself with the board-level sibling get_triage_board or stating explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
investigate_issueInvestigate an issueARead-only
The full sweep for a reported problem: find every related topic, extract the answers that already exist, separate them from the reports still open, fold in triage status, and end with concrete next steps. Use this when someone reports a problem and you need to know whether the forum has seen it before, whether it was solved, and whether anyone is already on it. Slower than find_answers because it opens several topics — prefer find_answers for a plain question.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only topics carrying all of these tags. | |
| depth | No | How many candidate topics to open in full. Default 5; raise for a stubborn issue. | |
| issue | Yes | The problem, described as the reporter would — symptoms, error text, what broke. | |
| categories | No | Restrict to these category ids (from list_categories). | |
| scan_pages | No | Listing pages to sweep when the forum has no search plugin. Default 3. | |
| within_days | No | Only consider content newer than this many days. Requires search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: the operation is expensive because it opens multiple topics, and it is positioned as a heavier sweep than find_answers. It does not describe pagination or return shape, but with annotations carrying the safety profile this is solidly above baseline.
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 front-loaded with the full sweep's steps and closes with the disambiguation, and every sentence carries information. It is slightly long and lists behavior that partly overlaps the schema parameters, but there is no filler.
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 6-parameter, no-output-schema tool, the description covers intent, triggering context, cost, and the high-level shape of the result ('end with concrete next steps'). It does not describe the return structure at all, but the enumerated sweep steps give the agent a reasonable expectation of what comes back.
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 100%, so all six parameters are already documented in the schema (depth, scan_pages, within_days, tags, categories, issue). The description only indirectly alludes to 'opens several topics' for depth and adds no syntax or format detail the schema lacks. Baseline 3 is correct when the schema does the heavy lifting.
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 and enumerates the actual operations of the sweep: find related topics, extract existing answers, separate open reports, fold in triage status, produce next steps. It explicitly contrasts with the sibling find_answers, so an agent can distinguish it without opening either schema.
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?
It states the trigger condition precisely ('when someone reports a problem and you need to know whether the forum has seen it before...') and names the alternative with the selecting condition ('prefer find_answers for a plain question'), plus the cost tradeoff ('slower because it opens several topics'). This is explicit when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesList categoriesARead-only
List the forum's category tree with ids, descriptions and topic counts. Use it to find the category id to pass to search_forum, list_recent_topics, or investigate_issue.
| 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 and openWorldHint=true, so the safety profile is covered. The description adds payload context (ids, descriptions, topic counts) that the agent cannot get from annotations or the empty schema, which is real added value. It stops short of noting the tree's hierarchy depth or whether counts are live, so not a 5.
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 sentences, zero waste. The return content is stated first and the routing guidance second, which is the right front-loading for a lookup tool.
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?
With no output schema, the description carries the return-value burden itself and does so ('ids, descriptions and topic counts'). Combined with annotations covering the read-only/open-world profile and a paramless schema, an agent has everything needed to 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?
Zero parameters, so the baseline of 4 applies. There are no arguments for the description to explain; the sentence correctly signals the tool is unconditioned by input.
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?
Specific verb (List) plus resource (forum's category tree) with scope detail: 'with ids, descriptions and topic counts'. That tells an agent exactly what comes back and distinguishes it from sibling reads like get_topic 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?
Explicitly states the purpose in workflow terms: 'Use it to find the category id to pass to search_forum, list_recent_topics, or investigate_issue.' That names three concrete downstream alternatives and the condition that selects them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recent_topicsList recent topicsARead-only
Browse topic listings — recent, popular, top, or unread — optionally inside one category. Useful for getting a feel for what is being reported lately, and as the way to explore a forum that has no search plugin.
| Name | Required | Description | Default |
|---|---|---|---|
| cid | No | Restrict to one category id. | |
| page | No | Listing page. | |
| limit | No | Maximum topics. Default 20. | |
| source | No | Which listing. Default recent. unread requires an authenticated token. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety and network scope are covered. The description adds only the caveat that it works where search is unavailable; it says nothing about pagination behavior, result size, or rate limits. The auth requirement for the 'unread' source lives in the schema, not the description.
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 tight sentences, front-loaded with the action and mode list, then the rationale. No filler or redundancy.
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 read-only listing tool with no output schema and fully documented parameters, the description covers purpose and usage adequately. It would be slightly stronger with a note on how paging interacts with the listings or a pointer to search_forum for filtered queries.
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 100%, so every parameter (cid, page, limit, source) is already documented, including the default and the auth note for 'unread'. The description restates the listing modes but adds no syntax, format, or interaction detail beyond the 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?
States a concrete verb (browse) and resource (topic listings) and enumerates the four listing modes that match the source enum, so the agent knows exactly what it returns. It also implicitly separates itself from search tools by framing itself as the exploration path, though it never names search_forum directly.
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?
Gives a clear use context ('getting a feel for what is being reported lately') and a fallback condition ('the way to explore a forum that has no search plugin'). It stops short of an explicit when-not or naming the alternative sibling tool, so it is strong but not fully prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_unanswered_questionsList unanswered questionsARead-only
List questions nobody has answered yet — the queue for someone who wants to help. With the Q&A plugin this is the forum's real unsolved list; without it, recent topics that have no replies, which approximates it but cannot tell a question from a discussion. Shows triage status per item when the Shotef plugin is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Listing page. | |
| limit | No | Maximum questions. Default 20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds non-obvious behavior: plugin-dependent accuracy, the inability to distinguish a question from a discussion in fallback mode, and conditional inclusion of triage status. Those degradations are exactly the semantics an agent needs to interpret results.
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?
Three tight sentences, front-loaded with what the tool returns and progressively layering plugin conditions. No filler, though the closing triage sentence is somewhat dense and could have been its own clause rather than a trailing aside.
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?
With no output schema, the description carries the burden of explaining what comes back, and it does mention per-item triage status and the underlying candidate set. It still omits pagination behavior and any hint of result ordering, so it is solid but not exhaustive.
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 100%, and the schema already documents page and the limit default of 20. The description adds nothing about pagination or result size, so the baseline 3 applies.
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?
States a specific verb and resource ('list unanswered questions') and frames the scope as 'the queue for someone who wants to help', which lets an agent distinguish it from search_forum, list_recent_topics, and find_answers without opening any schema.
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?
Explains the two operational regimes: with the Q&A plugin it is the authoritative unsolved list, without it it falls back to recent unreplied topics. This tells the agent when results are trustworthy but stops short of naming a sibling tool to use instead when the approximation is insufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_forumSearch the forumARead-only
Full-text search across topic titles and post bodies. Returns ranked matches with a snippet showing why each matched. Requires a search plugin on the forum (NodeBB core has none); when one is absent this falls back to scanning recent topics by title and says so. For answering a question, prefer find_answers, which also extracts the answers.
| Name | Required | Description | Default |
|---|---|---|---|
| in | No | Where to look. Default titlesposts (titles and post bodies). | |
| page | No | Result page, for paging past the first set. | |
| tags | No | Only topics carrying all of these tags. | |
| limit | No | Maximum results. Default 15. | |
| query | Yes | What to search for. Plain words work best; quotes are not special. | |
| sort_by | No | Ordering. Default relevance. | |
| posted_by | No | Only posts by this username. | |
| categories | No | Restrict to these category ids. | |
| within_days | No | Only content newer than this many days. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds real behavioral context beyond them: the dependency on a search plugin, the fallback to title-only scanning of recent topics, and the fact that the tool announces when it is degraded. It does not cover rate limits or result-count behavior, but this is well above the annotation baseline.
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?
Three sentences, front-loaded with the core capability, then the caveat, then the alternative. No sentence is redundant and every one carries information an agent needs.
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?
No output schema exists, so the description correctly compensates by describing the return shape ('ranked matches with a snippet showing why each matched'). Combined with the fallback disclosure and sibling routing, an agent has everything required to call and interpret this tool.
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 100% and every parameter carries its own description, so the baseline is 3. The description mentions ranked matches with snippets but adds no syntax or defaults for 'in', 'sort_by', or 'within_days' beyond what the schema already states.
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?
States a specific verb and resource ('Full-text search across topic titles and post bodies') and immediately distinguishes itself from the sibling find_answers. An agent can identify what this does and how it differs from alternatives without opening any schema.
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 names the alternative ('For answering a question, prefer find_answers, which also extracts the answers') and gives the condition that selects it. It also documents the degraded-mode scenario, telling the agent when this tool silently behaves differently.
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.
12 tool updates
v0.1.0- First observed
find_answers - First observed
forum_capabilities - First observed
get_post - First observed
get_topic - First observed
get_topic_answer - First observed
get_triage_board - First observed
get_triage_status - First observed
investigate_issue - First observed
list_categories - First observed
list_recent_topics - First observed
list_unanswered_questions - First observed
search_forum
TDQS
Scored across 12 tools
There is meaningful overlap in the search/answer cluster (search_forum, find_answers, investigate_issue, get_topic_answer), but the descriptions explicitly cross-reference and route the agent (e.g. 'prefer find_answers', 'prefer find_answers for a plain question'). get_topic vs get_post and triage status vs board are cleanly separated, so an agent can reliably pick.
Almost everything follows a verb_noun pattern: get_post, list_categories, search_forum, get_topic, find_answers, investigate_issue, get_triage_status, get_triage_board. The lone deviation is forum_capabilities (noun-only, no verb), but it stays snake_case and readable.
12 tools is well within the ideal band and each earns its place by covering a distinct read/triage action. No redundant or filler tools are apparent.
The set covers reading posts, topics, categories, listings, search, answer extraction, unanswered queues, and triage status/board — a coherent read-and-triage surface. It is read-only, so any posting/replying/updating workflow the domain might need is absent, but that appears intentional and is not a dead end for the stated purpose.
Maintenance
Related MCP Connectors
Search Stack Exchange questions, fetch Q&A threads as markdown, look up tag FAQs and user profiles.
Search real problems, solutions, failed approaches and observed outcomes shared by AI agents.
Public board where AI agents ask, answer and post findings across runtimes.
Search public agent questions and sourced findings, browse agents, and read the onboarding guide.
41
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI agents to interact with Discourse forums through search, reading topics/posts, managing categories and users. Supports secure authentication and optional write operations with rate limiting.142,264 npm74MIT- AlicenseAqualityCmaintenanceEnables AI agents to interact with Discourse forums through search, reading topics/posts, managing categories and tags, chat channels, and optionally creating content with safeguarded write operations.152,264 npmMIT
- FlicenseAqualityDmaintenanceConnects AI assistants to thousands of Tapatalk-enabled forums, enabling browsing, reading, searching, and optional posting.14-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search and read solved threads from the n8n community forum for vetted solutions.MIT