wikijs-mcp
Allows managing Wiki.js 2.x pages: search, read, create, update, move, delete, browse version history, and list assets through the Wiki.js GraphQL API.
Click on "Install 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., "@wikijs-mcpsearch for 'onboarding guide'"
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.
wikijs-mcp
An MCP server for managing Wiki.js 2.x pages: search, read, create, update, move, delete, browse version history, and list assets — all through the Wiki.js GraphQL API.
Tools
Tool | Description |
| Full-text search across pages. |
| List pages with ordering, tag, and locale filters. |
| Fetch a page by id or path, including its content. |
| Browse the page hierarchy. |
| List all tags, or search tags matching a query. |
| Create a new page. |
| Partially update a page by id. |
| Move/rename a page (requires |
| Delete a page (destructive). |
| Fetch a page's version history trail. |
| Fetch the content of a specific historical version. |
| Restore a page to a prior version. |
| List asset folders and files (read-only). |
Related MCP server: Wiki.js MCP Server
Quick start (stdio)
Add the server to Claude Code with claude mcp add:
claude mcp add wikijs -e WIKIJS_URL=https://wiki.example.com -e WIKIJS_TOKEN=your-api-key-here -- npx @sondt2709/wikijs-mcpFor Claude Desktop, Cursor, or any other MCP client that reads a JSON config, add:
{
"mcpServers": {
"wikijs": {
"command": "npx",
"args": ["@sondt2709/wikijs-mcp"],
"env": {
"WIKIJS_URL": "https://wiki.example.com",
"WIKIJS_TOKEN": "your-api-key-here"
}
}
}
}Getting an API key
Log in to your Wiki.js instance as an administrator.
Go to Administration → API Access.
Toggle Enable API on.
Click New API Key, give it a name and expiration, and grant it the permissions your workflow needs (
read:pagesat minimum;write:pages,manage:pages, andmanage:systemfor creating/updating/moving/deleting pages).Copy the generated token — it's shown only once — and use it as
WIKIJS_TOKEN.
Configuration
Variable / flag | Default | Description |
| — | Base URL of your Wiki.js instance (required). |
| — | API key from Administration → API Access (required). |
|
|
|
|
| Port to listen on when |
|
| pino log level: |
CLI flags take precedence over environment variables. See .env.example for a template.
HTTP / Docker mode
Run the server as a long-lived streamable-HTTP service instead of stdio — useful for sharing one instance across multiple clients, or running behind a reverse proxy.
cp .env.example .env # set WIKIJS_URL and WIKIJS_TOKEN
docker compose upThis builds the image from the included Dockerfile and starts the server with
TRANSPORT=http on port 3000:
MCP endpoint:
http://localhost:3000/mcpHealth check:
http://localhost:3000/healthz
Point your MCP client at the /mcp endpoint instead of spawning the process directly.
MCP Inspector
To poke at the server interactively:
pnpm inspectThis builds the project and launches the MCP Inspector against the stdio transport.
To inspect an HTTP deployment instead, start the server with docker compose up (or
TRANSPORT=http pnpm dev), then run npx @modelcontextprotocol/inspector on its own and
connect the Inspector UI to http://localhost:3000/mcp using the "Streamable HTTP"
transport option.
Development
pnpm install # install dependencies
pnpm dev # run from source with --watch
pnpm lint # eslint
pnpm typecheck # tsc --noEmit
pnpm format # prettier --write
pnpm build # bundle to dist/End-to-end tests run against a real, disposable Wiki.js instance in Docker:
pnpm e2e:wiki:up # start local Wiki.js in Docker
pnpm e2e:bootstrap # headless setup: admin account + API key + e2e/.env
pnpm test:e2e # build + run the e2e suite
pnpm e2e:wiki:down # tear down the container and its dataSee e2e/setup.md for details, including a manual setup fallback if
the bootstrap script fails.
Lefthook runs eslint --fix and prettier
on staged files at pre-commit, and typecheck + build at pre-push. It's installed
automatically via the prepare script after pnpm install.
Releasing
Pushing a tag matching v* (e.g. v0.2.0) triggers .github/workflows/release.yml,
which lints, typechecks, builds, and publishes the package to npm with provenance.
The NPM_TOKEN repository secret must be set (an npm automation token with publish
access to @sondt2709/wikijs-mcp) before pushing a release tag, or the workflow will fail at the
publish step.
License
Available Tools
13 toolscreate_pageCreate pageA
Create a new Wiki.js page. Path must not start with the locale (use "guides/install", not "en/guides/install").
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Page path, e.g. "guides/install" | |
| tags | No | ||
| title | Yes | ||
| editor | No | Editor type: markdown, ckeditor, code | markdown |
| locale | No | en | |
| content | Yes | Page content (markdown by default) | |
| isPrivate | No | ||
| description | No | Short page description | |
| isPublished | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| succeeded | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden of disclosing side effects and constraints. It only mentions a path convention, but does not state what happens on duplicate paths, whether authentication is needed, whether parent folders are auto-created, or any error behavior. For a mutation tool, this is a significant 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?
The description is concise and front-loaded: two sentences that state the key purpose and a critical constraint. Every word earns its place, with 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?
With 9 parameters, low schema coverage, and no annotations, a richer description is needed. The description only addresses the path parameter and ignores other important aspects like editor types, locale defaults, publication/private flags, and content format. Although an output schema exists, its content is not shown, so the description should have explained more about the operation's outcome and caveats.
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 only 44%, so the description should compensate. It adds meaningful semantics for the 'path' parameter by explaining the locale rule, which is not in the schema. However, it provides no added value for other parameters like tags, editor, isPrivate, or isPublished, leaving many options under-documented.
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's verb ('Create') and resource ('Wiki.js page'), which is a specific and unambiguous action. It distinguishes from sibling tools like update_page, delete_page, and move_page by indicating creation of a new page.
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 provides clear context for when to use this tool: creating a new page. It also gives a practical formatting guideline about not prefixing the path with locale. However, it does not explicitly mention alternatives or exclusions (e.g., when to use update_page instead), but the purpose is self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_pageDelete pageA
Permanently delete a page by id. DESTRUCTIVE and irreversible — confirm with the user before calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Page id to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| succeeded | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It clearly states that the action is permanent and irreversible, which is critical context for a deletion tool and goes beyond the basic 'delete' name.
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 one sentence, front-loaded with the destructive warning after a clear main action. It is concise and every word 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?
This simple delete tool has full parameter coverage and an output schema, so the description need not explain return values. The description covers the essential behavior (permanent deletion, irreversibility) and adds a usage requirement, making it complete for its complexity.
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 already describes the 'id' parameter with 'Page id to delete' and coverage is 100%. The description adds no further parameter semantics beyond the schema, 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?
The description clearly states the action: 'Permanently delete a page by id' with a specific verb, resource, and method. It distinguishes from siblings like get_page or update_page by emphasizing deletion and permanence.
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 warns that the operation is destructive and irreversible, and instructs to 'confirm with the user before calling this'. This provides a clear when-not guideline, establishing appropriate usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageGet pageA
Fetch one page by numeric id OR by path (+ locale, default "en"). Optionally slice its content by line range with startLine/endLine: 0-based, inclusive on both ends. Default (0..-1) returns the whole page. Negative values count from the end, Python-style (-1 = last line, -2 = second-to-last).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Page id (preferred when known) | |
| path | No | Page path, e.g. "guides/install" | |
| locale | No | Locale for path lookup | en |
| endLine | No | 0-based end line, inclusive. -1 (default) means the last line. | |
| startLine | No | 0-based start line, inclusive. Negative counts from the end. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| endLine | Yes | |
| startLine | Yes | |
| totalLines | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It provides detailed semantics for line slicing (0-based, inclusive, negative indexing, default whole page) which goes beyond the schema. It does not mention behaviors like id/path conflict resolution or error handling, but the core behavior is well covered.
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 three sentences, front-loaded with the primary purpose. Each sentence adds necessary detail (identification, line-range mechanics, default semantics) with 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?
For a retrieval tool with an output schema and no annotations, the description covers the essential semantics: how to identify a page, how to slice lines, and defaults. It leaves minor gaps such as behavior when both id and path are supplied or when neither is given, but overall it is sufficient for effective use.
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 the baseline is 3. The description adds value by clarifying the combined default (0..-1 returns whole page) and reinforcing the Python-style negative indexing, which is not fully assembled in the schema. This elevates the score to 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 uses a specific verb ('Fetch') and resource ('one page'), and clearly states the two identification methods (numeric id OR path). This distinguishes it from sibling tools like get_page_tree and get_page_history, which target different operations.
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 clearly establishes when to use this tool: when fetching a single page by id or path. However, it does not explicitly mention alternatives or exclusions (e.g., when to use list_pages instead), which would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_historyGet page historyA
List the version history trail of a page (newest first), paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Page id | |
| offsetPage | No | Zero-based page of the trail | |
| offsetSize | No | Entries per page |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| trail | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the only source of behavioral disclosure. It does communicate two traits: newest-first ordering and pagination, adding value beyond the schema. However, it does not mention whether the response includes full content or metadata only, nor any limits or caveats.
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, front-loaded sentence with no filler. It states the action, resource, and key attributes (newest first, paginated) efficiently.
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 an output schema and complete parameter descriptions, the description covers the core purpose, ordering, and pagination. It could explicitly contrast with get_page_version, but given sibling context and structured data, the gap is minor.
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%: all three parameters (id, offsetPage, offsetSize) are already described. The description's mention of pagination aligns with offsetPage/offsetSize but does not add new meaning. Baseline of 3 is appropriate since the schema carries the parameter documentation burden.
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 specifically names the verb ('List') and the resource ('version history trail of a page'), including the useful detail that results are ordered newest first. This clearly distinguishes it from sibling tools like get_page (current page) and get_page_version (specific version).
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 implies when to use the tool (when a paginated version history is needed), but it does not explicitly state alternatives or exclusions, such as 'for a single version, use get_page_version instead.' Sibling names provide context, but the description itself offers no direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_treeBrowse page treeA
Browse the page/folder hierarchy one level at a time. Omit parent for the root level; pass a folder item id as parent to descend.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ALL | |
| locale | No | en | |
| parent | No | Tree item id to list children of (omit for root) | |
| includeAncestors | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the one-level-at-a-time behavior and that parent must be a folder item id, which is useful. However, it does not mention other behavioral aspects such as mode filtering, the effect of includeAncestors, or pagination, leaving gaps.
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 two concise sentences, front-loaded with the core action and key behavior. Every word earns its place, with no redundancy or fluff.
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, so return values need not be explained. The description covers the core hierarchical browsing concept and the parent behavior, but it leaves mode and includeAncestors unexplained. For a 4-parameter tool, this is a noticeable gap, making it adequate but not complete.
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 only 25% (only parent has a description). The tool description adds the meaning that parent must be a folder item id, but it does not explain mode, locale, or includeAncestors. Since the description must compensate for low schema coverage, it is insufficient.
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 the page/folder hierarchy one level at a time, using the specific verb 'browse' and identifying the resource. It distinguishes itself from sibling tools like list_pages by emphasizing the hierarchical, level-by-level navigation.
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 gives clear usage context: omit parent for the root level, pass a folder item id to descend. This implies when to use the tool, but it does not explicitly exclude or compare to alternatives like list_pages or search_pages, so it is clear but lacks direct exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_versionGet page versionA
Fetch the content of a specific historical version of a page. Optionally slice its content by line range with startLine/endLine: 0-based, inclusive on both ends. Default (0..-1) returns the whole version content. Negative values count from the end, Python-style (-1 = last line, -2 = second-to-last).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | ||
| endLine | No | 0-based end line, inclusive. -1 (default) means the last line. | |
| startLine | No | 0-based start line, inclusive. Negative counts from the end. | |
| versionId | Yes | From get_page_history trail |
Output Schema
| Name | Required | Description |
|---|---|---|
| endLine | Yes | |
| version | Yes | |
| startLine | Yes | |
| totalLines | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden. It explains important behavioral details: default whole-content range, inclusive 0-based bounds, and Python-style negative indexing. It does not mention error handling or side effects, but the verb 'Fetch' implies a read-only operation, and no side effects are expected.
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 primary purpose, then compact yet complete explanation of the optional slicing behavior. No redundant or unnecessary 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 tool has an output schema, so the return structure need not be described. The description covers the core behavior and the non-obvious line-range semantics thoroughly. It lacks explicit error cases or a note that versionId should come from get_page_history, but the schema partly covers that, making it sufficiently complete.
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 description significantly adds meaning to startLine and endLine by explaining the 0-based inclusive ranges, default (0..-1), and negative index semantics beyond the schema's field descriptions. It does not elaborate on pageId/versionId beyond the schema, but versionId already has a useful reference in the schema ('From get_page_history trail').
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 action ('Fetch'), resource ('content of a specific historical version of a page'), and scope, distinguishing it from siblings like get_page (current content) and restore_page_version (mutation).
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 conveys clear context for use (historical content, optional line slicing) but does not explicitly mention alternatives or when not to use this tool. It relies on the distinct purpose rather than an explicit comparison, which is acceptable but not maximally instructive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsList assetsA
List uploaded assets (images/files) and subfolders in an asset folder. folderId 0 is the root folder.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ALL | |
| folderId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| assets | Yes | |
| folders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosure. It states the basic read-only behavior and the root folder convention, but it does not discuss pagination, return structure, or whether the list is recursive into subfolders. This is adequate but not rich.
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 two short sentences with no wasted words. It is front-loaded with the main purpose and then a specific detail about folderId, making it easy to scan.
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 simplicity (2 parameters, output schema available), the description covers the essential operation and adds a valuable root-folder note. It doesn't need to explain return values because an output schema exists. Missing details like pagination are minor for a list 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 0%, so the description must add meaning. It explicitly clarifies folderId 0 as root, but it does not explain the 'kind' parameter beyond the self-explanatory enum values in the schema. This partial compensation warrants a mid-range score.
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 verb and resource: 'List uploaded assets (images/files) and subfolders in an asset folder.' It distinguishes this tool from sibling page/tag tools by focusing on assets, and even clarifies the root folder identifier.
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 clear context for use (listing assets by folder) and explains the meaning of folderId 0 as root, but it does not explicitly mention when not to use this tool or name alternatives. This is acceptable for a simple list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesList pagesC
List Wiki.js pages with optional ordering, tag and locale filters.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only pages having all these tags | |
| limit | No | Max pages to return | |
| locale | No | ||
| orderBy | No | ||
| orderByDirection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | Yes | |
| total | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'List Wiki.js pages' and mentions filters, but does not disclose defaults, pagination behavior, or how filters interact. It adds little beyond the schema.
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 of 10 words, extremely concise and to the point. Every word contributes meaning, with no repetition or 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?
With 5 parameters, no annotations, and 40% schema coverage, the description is insufficiently complete. It omits key behavioral details like default ordering, pagination limits, and how filters combine. An output schema exists, so return values are covered, but usage context is lacking.
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 only 40%, so the description should compensate. It mentions ordering, tag, and locale filters, but does not explain the meaning of specific enum values or locale semantics. Thus it adds minimal value beyond what is already in 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?
The description states a clear action ('List') on a specific resource ('Wiki.js pages') and mentions optional filters, which makes its main function clear. However, it does not explicitly differentiate from the sibling tool 'search_pages', though the verb 'list' vs 'search' implies a distinction.
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 use this tool versus alternatives like search_pages, get_page_tree, or get_page. The description only states what it does without any contextual when-to-use or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList tagsA
List all page tags, or search tags matching a query string.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | If set, search tags matching this text |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral disclosure burden. The verbs 'List' and 'search' imply a read-only operation, but the description does not explicitly state safety, pagination, or case-sensitivity behavior.
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, front-loaded sentence that covers the core functionality in under 15 words. 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?
The tool is simple with one optional parameter and an output schema, so the description is mostly adequate. However, it lacks details on result ordering or search semantics, though the output schema may cover return values.
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 schema already documents the only parameter with a description, and the tool description essentially restates that behavior ('search tags matching a query string'). No additional semantic detail is added 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?
The description uses the specific verb 'List' with resource 'page tags' and clearly states both modes: listing all tags and searching by query. This distinguishes it from sibling tools focused on pages or assets.
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 implies usage by offering two modes (list all vs search) but does not explicitly discuss when to prefer this tool over siblings like search_pages. It provides no exclusions or alternative tool guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_pageMove / rename pageB
Move a page to a new path (and optionally another locale). Requires the manage:pages permission on the API key.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Page id | |
| destinationPath | Yes | ||
| destinationLocale | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| succeeded | Yes | |
| destinationPath | Yes | |
| destinationLocale | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It notes the permission requirement but omits potential side effects like link updates, handling of child pages, or conflict behavior. This is a significant gap for a move 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 concise, using two sentences with no wasted words. The most important information (move action, path, optional locale, permission) is front-loaded.
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?
Although an output schema exists, the description is incomplete for a mutating tool with no annotations. It does not mention expected return values, error conditions, or whether the operation is reversible. The permission note is helpful but not sufficient for full context.
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 only 33%, so the description must clarify parameters. It adds meaning by identifying 'destinationPath' as the new path and 'destinationLocale' as an optional locale, but does not explain path format or constraints beyond schema basics.
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 moves a page to a new path, optionally to another locale. This is a specific verb-resource combination that distinguishes it from siblings like update_page and delete_page.
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 guidance is given on when to use this tool versus alternatives such as update_page or create_page. It only mentions a permission requirement, with no context on typical scenarios or comparisons to other page operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_page_versionRestore page versionA
Restore a page to a previous version from its history. The current state is preserved as a new history entry.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | ||
| versionId | Yes | Version to restore, from get_page_history |
Output Schema
| Name | Required | Description |
|---|---|---|
| pageId | Yes | |
| succeeded | Yes | |
| versionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses a key safety behavior: the current state is preserved as a new history entry, indicating the operation is non-destructive. However, it does not mention permission requirements or rate 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?
Two sentences, no filler. The first sentence front-loads the purpose and the second adds the critical preservation detail.
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 the core purpose and a key side effect, but given the tool's mutation nature and lack of annotations, it omits usage guidelines and parameter context, leaving it somewhat incomplete.
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 description does not add meaning to the parameters. The input schema already describes versionId as 'Version to restore, from get_page_history', but pageId lacks description and the description does not compensate for this gap.
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?
One sentence clearly states the action: restoring a page to a previous version from history. The verb 'restore' and resource 'page' are specific, and it implicitly distinguishes from read-only sibling tools like get_page_version and get_page_history.
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 implies usage (for restoring versions) but does not explicitly state when to use it versus alternatives, nor mention any exclusions or prerequisites. It would benefit from a note that read-only alternatives exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pagesSearch pagesA
Full-text search Wiki.js pages. Returns matching pages with id, title, path and locale. Use get_page to fetch content.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Restrict results to this path prefix | |
| query | Yes | Search keywords | |
| locale | No | Locale code, e.g. "en" |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| totalHits | Yes | |
| suggestions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It mentions that matching pages are returned with certain fields, but does not disclose pagination, ordering, authentication needs, or rate limits. The description adds some context but is not rich in behavioral details.
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 two sentences, front-loaded with the core purpose, and includes a useful pointer to get_page. There is no wasted wording or redundant 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?
Given that there is an output schema, the description does not need to detail return structures. It covers the tool's purpose and gives a relevant follow-up action. It is complete enough for a straightforward search tool, though minor aspects like result limits are not mentioned.
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 100% parameter description coverage, so the baseline is 3. The description does not add any additional parameter semantics beyond what the schema already provides, such as examples or formatting rules.
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 verb 'search' and the resource 'Wiki.js pages', specifying it does full-text search. It also lists the return fields (id, title, path, locale), which distinguishes it from sibling tools like list_pages (which lists all pages) and get_page (which fetches content).
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 clear context for using search_pages (full-text search) and explicitly suggests using get_page to fetch content, which is a helpful downstream instruction. However, it does not explicitly compare to list_pages or state when to use search over listing, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pageUpdate pageA
Update an existing page by id. Only the provided fields change. Get the id from get_page, list_pages or search_pages first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Page id | |
| tags | No | Replaces the whole tag list | |
| title | No | ||
| content | No | ||
| isPrivate | No | ||
| description | No | ||
| isPublished | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| succeeded | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds the key detail that 'only the provided fields change,' clarifying that updates are partial rather than full replacements. However, it does not mention permissions, reversibility, side effects, or failure conditions, leaving notable gaps for a mutation tool.
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 three short sentences that immediately state the core action, clarify the partial-update behavior, and provide a critical prerequisite. Every sentence serves a purpose with no redundancy or 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?
The description covers the core operation and the unique partial-update behavior, and the presence of an output schema handles return-value details. However, for a tool with 7 parameters and no annotations, it lacks explanations of field semantics and potential side effects, making it only moderately complete for AI decision-making.
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 only 29% (only 'id' has a description). The description does not compensate by explaining the other parameters (tags, title, content, isPrivate, description, isPublished). It merely states that provided fields change, but does not define their meaning or constraints, so it fails to add sufficient value for the majority of parameters.
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 begins with 'Update an existing page by id,' which clearly specifies the verb (update) and resource (page). It distinguishes itself from sibling tools like create_page, delete_page, and move_page by focusing on modifying an existing page rather than creating, removing, or relocating it.
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 clear context by instructing users to 'Get the id from get_page, list_pages or search_pages first,' which is a useful prerequisite. However, it does not explicitly state when not to use this tool or directly compare it to alternatives (e.g., when to use create_page instead), so it stops short of full guidance.
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. Dates show when Glama detected each change.
13 tool updates
v0.1.0- First observed
create_page - First observed
delete_page - First observed
get_page - First observed
get_page_history - First observed
get_page_tree - First observed
get_page_version - First observed
list_assets - First observed
list_pages - First observed
list_tags - First observed
move_page - First observed
restore_page_version - First observed
search_pages - First observed
update_page
TDQS
Each tool targets a distinct resource and action: pages vs tags vs assets, and within pages there are clear separations between listing, searching, fetching, creating, updating, moving, deleting, and history operations. Potential confusions (list_pages vs search_pages, get_page vs get_page_version) are resolved by clear descriptions.
All tool names follow a consistent verb_noun pattern with lowercase snake_case. The verbs (list, search, get, create, update, move, delete, restore) are uniformly used, and nouns clearly indicate the target resource (pages, tags, assets, page_tree, page_history).
13 tools is a well-scoped number for a Wiki.js content management server. The count covers core page lifecycle, search/navigation, history/restore, and auxiliary tag/asset listing without being excessive or too sparse.
The page lifecycle is fully covered (create, read, update, delete, move, list, search, tree, history, restore). The only notable gap is asset management, where only listing is provided (no upload/download/delete), but this is likely outside the tool's primary content-focused purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
A MCP server built for developers enabling Git based project management with project and personal…
The official MCP Server for the Mux API
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server for Wiki.js that enables AI agents to create, read, update, search, list, and move wiki pages via the GraphQL API. It supports surgical section updates and structured content management through named sections.6MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides a unified interface to manage Wiki.js pages, users, and groups via GraphQL API, enabling AI agents to create, read, update, and delete content and perform administrative tasks.4113MIT
- AlicenseAqualityBmaintenanceMCP server for Wiki.js that exposes 29 tools for managing pages, comments, tags, assets, users, navigation, and more via HTTP/SSE with built-in mutation safety.2936Creative Commons Zero v1.0 Universal
- AlicenseNot gradedqualityAmaintenanceMCP server for accessing Wiki.js through its GraphQL API, enabling page management, search, tags, and system info operations.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sondt2709/wikijs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server