Formidable MCP Companion
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., "@Formidable MCP Companionsearch the docs for frm_validate_field_entry"
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.
Formidable MCP Companion
Offline documentation MCP server for Formidable Forms. It mirrors the knowledge base into local markdown, indexes it at section level with BM25, and exposes it to MCP clients such as Claude Desktop, Claude Code, and opencode.
This project is modeled on laravel-mcp-companion, scoped to a single documentation source for a lean first release.
Features
Offline corpus — all Formidable knowledge base articles stored as markdown.
Section-level search — BM25 over
##sections, with a literal-substring fallback for symbols such asfrm_validate_field_entry.Section reads — fetch just the heading you need instead of a 30k-token page.
Category browsing — the site's breadcrumb hierarchy (
forms/form-builder, ...).Incremental updates — only articles whose upstream
lastmodchanged are fetched.Safe path handling — every read is contained to the local corpus.
MCP resources —
formidable://docs/{doc}andformidable://category/{path}.
Related MCP server: opencode-docs
Quick start
cd /home/user444/Projects/ai/formidable-mcp-companion
python3 -m venv .venv
.venv/bin/pip install -e .
# Download the documentation (639 articles, roughly 10-20 minutes).
.venv/bin/python -m formidable_mcp.updater --docs-path docs
# Start the MCP server over stdio.
.venv/bin/formidable-mcp --docs-path docs--update-docs refreshes the corpus before the server starts:
.venv/bin/formidable-mcp --docs-path docs --update-docsMCP client configuration
Claude Desktop / Claude Code
{
"mcpServers": {
"formidable": {
"command": "/home/user444/Projects/ai/formidable-mcp-companion/.venv/bin/python",
"args": [
"-m", "formidable_mcp",
"--docs-path", "/home/user444/Projects/ai/formidable-mcp-companion/docs"
]
}
}
}opencode
{
"mcp": {
"formidable": {
"type": "local",
"command": [
"/home/user444/Projects/ai/formidable-mcp-companion/.venv/bin/python",
"-m", "formidable_mcp",
"--docs-path", "/home/user444/Projects/ai/formidable-mcp-companion/docs"
],
"enabled": true
}
}
}Tools
Tool | Purpose |
| Ranked sections with snippet, anchor, doc id |
| Read one section by anchor or heading |
| Read a full article |
| List article metadata |
| Heading/anchor table of contents |
| Subcategories and articles in a category |
| Every category path with counts |
| Article count, sync time, corpus age |
| Refresh from formidableforms.com |
doc accepts either a full id (forms/form-builder/field-options) or a unique
slug (field-options).
Corpus layout
docs/
├── formidable/
│ └── forms/
│ └── form-builder/
│ └── field-options.md
└── metadata/
├── index.json # article metadata, headings, anchors
└── sync.json # sync timestamps and failuresEach markdown file keeps the site's stable heading anchors:
## Default Value {#kb-default-value}Updater options
.venv/bin/python -m formidable_mcp.updater \
--docs-path docs \
--force # refetch everything
--limit 10 # fetch at most 10 pending articles
--dry-run # fetch and parse without writing
--workers 2 # concurrent requests
--log-level INFOThe updater is deliberately polite: two workers, a short delay between requests,
and Retry-After-aware backoff on HTTP 429 responses.
Development
.venv/bin/pip install -e ".[dev]"
.venv/bin/pytest -q
.venv/bin/ruff check src testsNotes
Documentation content belongs to Strategy11, LLC (Formidable Forms). This project only mirrors it for local reference; check the upstream terms before redistributing the corpus.
The parser targets the current WordPress/Heroic Knowledge Base markup. If the site changes, update the selectors in
src/formidable_mcp/updater/parser.pyand the noise list insrc/formidable_mcp/config.py.
License
Code: MIT. Documentation content: property of its respective owner.
Available Tools
9 toolsbrowse_docs_by_categoryARead-onlyIdempotent
Browse a category: returns its subcategory paths and every article inside it, including nested subcategories.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | Category path such as "forms", "forms/field-types", or "developer-documentation". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is covered. The description adds genuinely useful behavior — that traversal is recursive into nested subcategories — but says nothing about result size, depth limits, or pagination for large trees, which matters for a recursive enumeration.
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?
One front-loaded sentence with no filler; the verb and the return contents come first. Slightly dense with the trailing "including nested subcategories" clause, but nothing is wasted.
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?
A one-parameter read tool with an output schema and full param coverage needs little more than this. The main omission is any hint about scale or depth of the recursive listing, which would help an agent decide whether to browse or search.
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% and the single parameter already carries example paths ("forms", "forms/field-types"). The description adds no path syntax, root/empty-string convention, or error behavior beyond what the schema states, so 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 concrete verb and resource ("Browse a category") and specifies the payload: subcategory paths plus every article, including nested ones. That recursion detail is what distinguishes it from a flat catalog lister like list_categories, though no sibling is named 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?
Usage is implied rather than stated — the agent can infer it should call this to enumerate a category's contents, but the description never says when to prefer it over search_docs, list_docs, list_categories, or get_doc_structure, nor does it state any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docs_infoARead-onlyIdempotent
Report corpus metadata: article count, categories, last sync, and how many days old the local copy is.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds real value beyond that by disclosing that the data is a local copy with a measurable age, which tells the agent results elsewhere may be stale and that this call is a cheap status probe.
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?
One sentence, front-loaded with the verb and resource, then the returned fields in a compact list. No filler and nothing that could be cut.
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 parameters, an output schema, and read-only annotations, the description covers what an agent needs to decide to call it. It stops short of explaining how the staleness figure should influence other operations, which would be the last useful detail for a corpus-status 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?
The tool takes zero parameters, so the baseline applies and there is nothing for the schema to under-document. The description correctly implies a single global, unfiltered query over the whole corpus.
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 gives a specific verb ('Report') and resource ('corpus metadata') and enumerates exactly what is returned: article count, categories, last sync, and local-copy age. That clearly separates it from the read/search siblings, though the mention of 'categories' creates mild overlap with list_categories that is not explicitly disambiguated.
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?
Usage is only implied: reporting local-copy age hints at a staleness check before or after searching, but the description never states when to call this versus list_categories or list_docs, nor any exclusions. An agent can infer the intent but is given no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_doc_structureBRead-onlyIdempotent
Show the heading/anchor table of contents for one article.
| Name | Required | Description | Default |
|---|---|---|---|
| doc | Yes | Article id or unique slug. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that the payload is a heading/anchor listing rather than body content, but does not disclose ordering, hierarchy depth, or whether anchor identifiers are callable elsewhere; an output schema exists, so return-format detail is not required.
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?
One sentence with no filler, and the object of the operation (heading/anchor TOC) is front-loaded after the verb. It is efficient, though the extreme brevity leaves the guidance gaps noted above.
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 one-parameter read tool with full schema coverage, an output schema, and safety annotations, the description covers the essentials. It is still thin on how the TOC relates to the read_doc/read_doc_section workflow, which is the main thing an agent needs to sequence calls 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?
Schema coverage is 100% and the single `doc` parameter is documented as "Article id or unique slug," so the schema carries parameter meaning. The description only adds that a single article is targeted ("one article"), which is marginal beyond that 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?
"Show the heading/anchor table of contents for one article" names a specific resource (headings/anchors TOC) and a clear read verb, which distinguishes it in spirit from read_doc and read_doc_section. It stops short of explicitly naming those siblings, so the differentiation must be inferred from the word "structure."
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?
There is no when-to-use guidance: nothing says to call this first to find anchors before fetching a section with read_doc_section, nor any exclusions. The agent must infer the navigation use case from the phrase "table of contents" alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesARead-onlyIdempotent
List every documentation category path with article counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered without description help. The description adds that results are exhaustive ('every') and that counts are included, which is useful context about result shape. It says nothing about ordering, depth of paths, or what an empty result means, so it earns a middling score rather than a high one.
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?
A single sentence that front-loads the scope ('every documentation category path') and appends the one piece of payload detail that matters ('with article counts'). There is no filler, hedging, or restatement of the tool name.
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 zero parameters, full schema coverage, and an output schema that documents the return shape, the definition is nearly self-sufficient; the description need not explain the response format. The only real gap is the lack of differentiation from browse_docs_by_category, which the sibling list shows is a live ambiguity risk.
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 tool takes zero parameters, which is the baseline-4 case; there is nothing to disambiguate and no schema gap to compensate for. The description correctly signals that no filtering input is accepted by emphasizing 'every'.
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 gives a specific verb ('List'), a specific resource ('every documentation category path'), and even the payload shape ('with article counts'), so the agent knows exactly what comes back. It does not name or contrast with the closely related sibling browse_docs_by_category, so the boundary between the two must be inferred.
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?
Usage is only implied: an agent can guess this is the discovery call to run before browsing or reading docs, and 'every ... path' hints at a full unfiltered enumeration. There is no explicit when-to-use, no when-not-to-use, and no mention of browse_docs_by_category as the alternative for drilling into a single category.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docsBRead-onlyIdempotent
List documentation articles, optionally filtered by category path.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional category path, e.g. "add-ons/ecommerce". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds only that category filtering is optional, and says nothing about whether the full corpus is returned, ordering, or result size limits — behavior an agent might care about for a list 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?
A single front-loaded sentence with no filler or redundancy. It is arguably over-terse given the crowded sibling set, but nothing in it is wasted.
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 one optional parameter, full schema coverage, an output schema, and safety annotations, the description covers what the agent minimally needs to invoke it. The remaining gap is routing guidance against the several similar listing/search siblings.
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% and the schema's own description supplies the format example ('add-ons/ecommerce'). The description only echoes that the category filter is optional, adding no meaning beyond the schema, 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?
The description names a specific verb and resource ('List documentation articles') plus the filtering scope, so the agent knows exactly what the tool returns. It does not distinguish itself from the closely related siblings search_docs and browse_docs_by_category, which is the main clarity gap.
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?
There is no guidance on when to choose this tool over search_docs, browse_docs_by_category, or list_categories, all of which plausibly overlap. 'Optionally filtered by category path' hints at the filter's use, but nothing tells the agent when the unfiltered list is the right call versus a search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docARead-onlyIdempotent
Read a complete documentation article. Large articles can exceed 30,000 tokens; use search_docs + read_doc_section when possible.
| Name | Required | Description | Default |
|---|---|---|---|
| doc | Yes | Article id or unique slug. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered; the description adds the genuinely useful behavioral detail that articles can exceed 30,000 tokens, which is a real context-cost warning. It says nothing about truncation, pagination, or linked-section behavior, which is the main residual gap.
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, and the core action is front-loaded ahead of the cost caveat and the alternative. Every clause carries information the 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?
For a single-parameter read tool with an output schema and read-only annotations, this is close to sufficient: purpose, cost warning, and alternative path are all present. Only the missing guidance on when a full read is unavoidable keeps it short of full marks.
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?
With schema description coverage at 100% and only one parameter, the schema already explains that `doc` accepts an id or unique slug. The description adds no format examples, no slug-versus-id distinction, and no error behavior for unknown ids, so it neither helps nor hurts beyond the schema 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?
"Read a complete documentation article" gives a specific verb and resource, and the word "complete" implicitly separates it from the sibling read_doc_section, which fetches only part. An agent can pick between the two 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 names concrete alternatives (search_docs + read_doc_section) and the condition favoring them (large articles). The qualifier "when possible" is loose, though – it never states the case where a full read is actually required, so the routing rule is suggestive rather than decisive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_doc_sectionARead-onlyIdempotent
Read one section of a documentation article by anchor or heading. Prefer this over read_doc; a section is typically a few hundred tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| doc | Yes | Article id from search_docs (e.g. "forms/form-builder/field-options") or a unique slug such as "field-options". | |
| section | Yes | Anchor ("kb-default-value"), heading ("Default Value"), or a heading prefix. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds genuinely new behavioral context by stating the expected output size ('a few hundred tokens'), which helps with budgeting and batching decisions. It does not cover failure modes such as a missing section or an ambiguous heading prefix, which is a minor gap against the annotations already in place.
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 with zero filler, and the scoping statement is front-loaded ahead of the sibling comparison. Every clause carries information.
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 an output schema present, a fully covered parameter schema, and safety annotations, the description covers what an agent needs to select and invoke it. The only meaningful omission is what happens when the section identifier does not resolve.
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%, so both parameters are already fully documented in the schema, including the anchor/heading/prefix forms. The description only echoes 'anchor or heading' and adds no syntax or disambiguation detail beyond that 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 and resource ('Read one section of a documentation article') with an explicit scoping mechanism ('by anchor or heading'), which makes it immediately distinguishable from the sibling read_doc, which returns a whole article.
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 preferred alternative ('Prefer this over read_doc') and justifies it with a token-cost rationale. It lacks an explicit when-to-use-read_doc-instead clause, but the implied inverse (need the whole article) is easy to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsARead-onlyIdempotent
Search Formidable Forms documentation. Returns ranked sections with a snippet, heading, anchor, and doc id. Pass the doc id + anchor to read_doc_section for the full section.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of sections to return (1-25). | |
| query | Yes | Natural-language question or keywords. | |
| category | No | Optional category path filter, e.g. "forms" or "forms/form-builder". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds real behavioral context beyond that: results are ranked sections with only a snippet, not full content, and a second call is required to get the full section — which shapes how an agent should consume the output.
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 short sentences with zero filler, front-loaded with the purpose and followed by result shape and the natural next step. 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?
An output schema exists and all three parameters are documented, so the description need not explain return values; what it does explain is the snippet-to-full-section handoff. Minor gap: no mention of empty-result behavior or whether the query is keyword vs natural-language matching.
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 query, limit (1-25, default 5), and category path are already fully documented in the schema. The description adds no extra meaning about parameter interplay (e.g. how category narrows ranking or what happens when no sections match), 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 ("Search Formidable Forms documentation") plus the granularity of results (ranked sections with snippet, heading, anchor, doc id). The final sentence distinguishes it from read_doc_section, so an agent can tell the search tool apart from the read/list siblings 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?
The description gives a clear two-step workflow: search here, then pass doc id + anchor to read_doc_section for full content. It does not explicitly say when to prefer list_docs / browse_docs_by_category / get_doc_structure over searching, so the alternative-selection guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_docsAIdempotent
Refresh the documentation corpus from formidableforms.com. Fetches only articles whose upstream last-modified timestamp changed unless force=true.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Refetch every article even if unchanged. | |
| limit | No | Only process the first N pending articles (useful for testing). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, open-world, idempotent, non-destructive operation, so the safety bar is partly covered. The description adds the valuable incremental-sync rule (only changed last-modified timestamps), but omits what happens to locally stored articles that were removed upstream, whether local edits are overwritten, and how long or how costly the fetch is.
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, zero filler, with the core action stated first and the default-vs-force contrast immediately after. Nothing could be removed without losing meaning.
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 only two optional parameters, full schema coverage, an output schema, and annotations, the description covers what an agent needs to decide and call correctly. The remaining gap is downstream effects on the local corpus, which matters for a mutation tool but is a modest omission given the annotation coverage.
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 the baseline is 3, and the description does reinforce the meaning of force=true as a full refetch. It adds no information about the limit parameter, but the schema already explains that one adequately.
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 gives a specific verb and resource — 'Refresh the documentation corpus from formidableforms.com' — which clearly separates this ingest/sync tool from the read-oriented siblings (search_docs, read_doc, list_docs). It stops short of naming any sibling explicitly, but the write/refresh nature is unmistakable.
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 default incremental behavior and the condition that overrides it ('unless force=true'), which is useful decision guidance for the force flag. However, it never says when an agent should invoke a refresh at all versus just reading existing docs, nor any prerequisite such as needing a stale corpus first.
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.
9 tool updates
v0.1.0- First observed
browse_docs_by_category - First observed
get_doc_structure - First observed
get_docs_info - First observed
list_categories - First observed
list_docs - First observed
read_doc - First observed
read_doc_section - First observed
search_docs - First observed
update_docs
TDQS
Scored across 9 tools
Most tools target distinct documentation operations, and the descriptions clearly steer agents from search to section reading. There is mild overlap between list_docs, browse_docs_by_category, and list_categories, but the descriptions make their boundaries understandable.
All tools use snake_case and generally follow a predictable verb_noun pattern such as search_docs, read_doc_section, list_categories, and update_docs. The minor variation in browse_docs_by_category is readable and still consistent with the overall convention.
Nine tools is well-scoped for a documentation companion server. Each tool supports a distinct part of the discover, browse, read, and refresh workflow without excessive surface area.
The tool set covers the full documentation lifecycle: discovery via search and listing, navigation via categories and structure, reading at section and article levels, metadata inspection, and corpus refresh. No obvious retrieval or maintenance gaps remain.
Maintenance
Related MCP Connectors
MCP server for querying Forkast documentation
Read-only MCP server for the OrchestKit docs: full-text search + Markdown fetch. No auth.
Read-only Frosh MCP: search and read public frosh.org docs, blog and overview.
Unofficial MCP server for the Ionic Framework documentation, components and blog.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceIndexes documentation sites by base URL and serves keyword search, optional semantic search, and Markdown page retrieval as MCP tools, all from a single SQLite file.-
- AlicenseAqualityDmaintenanceScrapes, stores, and searches documentation locally, enabling AI assistants to access and query documentation via MCP.114MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to search, navigate, and read the complete Hermes Agent documentation through a local SQLite FTS5 index, with tools for full-text search, page reading, and browsing documentation structure.MIT
- AlicenseAqualityCmaintenanceEnables MCP-speaking assistants to search an offline library of practical self-reliance knowledge and add new documents to it.10MIT