wiki-skills
This server provides an MCP interface to search, read, create, edit, and manage pages and assets in an ok-wiki knowledge base, with history, tagging, and file uploads. Destructive operations (move, rename, delete) are deliberately not available.
Search and read pages: Full-text search, get a page by ID or path, list by tags or recency, and retrieve specific historical versions.
Create and edit pages: Create new markdown pages with title, content, tags, and status; update existing pages partially via safe read-modify-write patches.
History and versioning: List a page's revision history, fetch a specific version, and restore a page to an earlier version non-destructively.
Tags: List all tags, search existing tags to avoid duplicates.
Assets: List assets and folders, create asset folders, upload files with returned markdown references for easy embedding.
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., "@wiki-skillsFind a page about API authentication"
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.
ok-wiki-skills
A local MCP connector and Codex plugin that lets Claude and Codex search, read, create, and edit pages in the ok-wiki knowledge base.
It reaches the wiki over HTTP with an API key that never enters the model's context, and speaks MCP
two ways: over stdio as a child process of Claude Code or the self-contained Codex plugin, or
over Streamable HTTP for remote hosts such as claude.ai and ChatGPT, which need a public HTTPS
URL (or a supported secure tunnel) and OAuth
(docs/adr/0006).
Start at
docs/architecture.md.
What it can do
Search and read — full-text search, fetch a page by path or id, list pages by tag or recency
Create and edit — create markdown pages at a path the connector derives (see below); patch an existing page's content, title, description, tags, or published state
History — list a page's revisions, fetch a specific version, restore a page to an earlier one
Tags — list and autocomplete the wiki's existing tag vocabulary
Assets — upload a file and get back a ready-to-paste markdown reference; list assets and create folders
Related MCP server: requarks-wiki-mcp
What it deliberately cannot do
No moving, renaming, or deleting pages. Those break inbound links or lose content, and a
mistyped path is exactly the error a model makes. Do them in the ok-wiki UI. The boundary is
enforced by the tool surface—move and delete tools do not exist—and the connector group withholds
delete:pages. The group still needs manage:pages because ok-wiki requires it for single-page
reads. Reasoning: docs/adr/0005.
Also out of scope: comments, navigation, users and groups, theming, and administrative operations.
Where new pages land
You don't choose the path—each creation tool derives it. There is no path input on any
creation tool. Claude's wiki_create_page takes three human names and slugifies each into one
segment:
project: "Moontower" chatTitle: "Release planning" artifactName: "Deployment checklist"
↓
claude/moontower/release-planning/deployment-checklistCodex uses the separate wiki_create_codex_page contract:
workspace: "wiki-skills" threadTitle: "Add Codex support" artifactName: "Plugin guide.md"
↓
codex/wiki-skills/add-codex-support/plugin-guideStapler documents use wiki_create_stapler_page, which files into folders a human already made:
folder: "Moontower AI" subFolder: "Wiki Skills" artifactName: "Architecture.md"
↓
stapler/moontower-ai/wiki-skills/architectureThe claude/, codex/, and stapler/ roots preserve host provenance. Slugification lowercases,
turns spaces, underscores and dots into hyphens, drops a trailing file extension, and discards
anything outside a-z, 0-9, and -.
wiki_create_stapler_page carries one extra rule the other two don't: folder and subFolder
must already exist, and it never creates them. Both values come from the user asking for the
document—the model is told not to infer them. Before writing, the tool asks the wiki's page tree
whether the parent folder is there and refuses if it isn't, naming the missing level. ok-wiki has no
folder entity for pages (pageTree folder rows are synthesized from the paths of existing pages), so
the first page under a new Stapler folder has to be created in the ok-wiki UI; every later document
can go through the tool.
Because there is no move tool, a wrong path is permanent—which is why placement is a schema rule
rather than advice. Pages that predate these conventions stay where they are and remain editable by
path through wiki_update_page. Claude conventions live in SKILL.md; Codex policy
lives in plugins/ok-wiki/skills/wiki-authoring/SKILL.md.
Quickstart
1. Build
Install Node.js 22 or newer, then:
cd /path/to/wiki-skills
npm install
npm run build # MCP registration points at dist/index.js, not src/2. Enable the ok-wiki API
In the wiki: Administration → API Access → enable. Without this, every request is rejected with "API is disabled. You must enable it from the Administration Area first."
3. Mint a scoped API key
Create a group for the connector granting exactly:
read:pages, read:source, write:pages, read:history, read:assets, write:assets,
manage:pages
Grant them in both the group's global permissions and its page rules — the wiki checks both
layers. manage:pages looks like more than a reader needs, but the wiki's single-page resolvers
require it: without it, page lookups fail with "You are not authorized to view this page" even
though listing works (docs/ok-wiki-api.md §4).
Then Administration → API Access → New API Key, bound to that group.
read:source is the one that fails quietly if you forget it — pages come back with a null body
instead of an error. Use a dedicated key so it can be revoked independently and so wiki history
distinguishes agent edits from human ones. Details:
docs/ok-wiki-api.md §2.
4. Register with Claude Code
claude mcp add wiki \
--env WIKI_BASE_URL=http://localhost:3000 \
--env WIKI_API_KEY=<your-api-key> \
-- node /path/to/wiki-skills/dist/index.jsOr, to share it with a project via .mcp.json:
{
"mcpServers": {
"wiki": {
"command": "node",
"args": ["/path/to/wiki-skills/dist/index.js"],
"env": {
"WIKI_BASE_URL": "http://localhost:3000",
"WIKI_API_KEY": "${WIKI_API_KEY}"
}
}
}
}Prefer the ${VAR} form in any file you might commit — don't put the key in version control.
5. Verify
Run /mcp in Claude Code and confirm wiki is connected with its tools listed. Then ask for
something read-only, like "search the wiki for onboarding", to exercise wiki_search_pages.
Codex plugin installation
The repository marketplace packages ok-wiki version 1.0.0 from plugins/ok-wiki for Codex CLI
and other local Codex hosts. It uses the bundled ./mcp/server.mjs and local ok-wiki MCP server
definition. This is not the package used by hosted ChatGPT. Writable mode publishes 15 total tools;
readonly mode publishes 8 read-only tools.
The plugin requires Node.js 22 or newer, matching package.json
(engines.node: ">=22").
From a clean clone, install dependencies and deterministically rebuild the checked-in bundle:
npm install
npm run build:pluginThe plugin reads required WIKI_BASE_URL and WIKI_API_KEY values from the local process
environment. It also forwards the seven optional variables WIKI_LOCALE, WIKI_TIMEOUT_MS,
WIKI_READONLY, WIKI_MAX_CONTENT_BYTES, WIKI_LOG_LEVEL, WIKI_MAX_UPLOAD, and
WIKI_UPLOAD_ALLOWLIST. Keep secret values only in local environment configuration; never add
them to the plugin, .mcp.json, .codex-plugin/plugin.json, or
.agents/plugins/marketplace.json.
Codex CLI
Register the repository marketplace, verify discovery, and install the plugin in this exact order:
codex plugin marketplace add <repo-root>
codex plugin list --marketplace wiki-skills --available --json
codex plugin add ok-wiki@wiki-skillsStart a fresh Codex CLI thread and confirm /mcp lists the ok-wiki server. After local source
changes, run npm run build:plugin, rerun codex plugin add ok-wiki@wiki-skills, and start a new
thread so the rebuilt artifact is loaded.
ChatGPT desktop and chatgpt.com
Do not use the repository marketplace or the local stdio package for the ChatGPT interface. The
desktop application uses the same hosted ChatGPT connection and plugin records as chatgpt.com; it
does not inherit WIKI_BASE_URL or WIKI_API_KEY from the shell that launched it. Use the public
HTTP/OAuth server, register it as a ChatGPT MCP app, and install the separate
plugins/ok-wiki-chatgpt package described below.
Authoring modes
The bundled skill starts in ask mode: creating Markdown does not write to the wiki or trigger
an unsolicited save offer. An explicit request to save, post, or publish a new Markdown artifact
uses wiki_create_codex_page.
A clear instruction such as "use auto mode" enables conversation-local automatic saving until
the user disables it. Auto mode saves each completed .md file newly created by Codex during the
active task exactly once after finalization. It excludes edited pre-existing Markdown, scratch
files, files created by another process, and non-Markdown outputs. Auto mode is never persisted and
never converts a collision into an update; existing pages require an explicit
wiki_get_page → wiki_update_page workflow.
The product and safety contracts for this workflow are
docs/codex-plugin-architecture.md,
docs/codex-plugin-prd.md, and
docs/codex-plugin-tasks.md.
Connecting from ChatGPT or claude.ai
Remote clients do not spawn this repository's local process. They reach a public HTTPS URL (or a
supported secure tunnel), so the connector runs its own OAuth 2.1 authorization server
(docs/adr/0006). Client registration is
automatic through CIMD or DCR; do not configure a static OAuth client ID or secret.
1. Run the HTTP entrypoint
WIKI_BASE_URL=http://localhost:3000 \
WIKI_API_KEY=<your-api-key> \
WIKI_MCP_BEARER=$(openssl rand -base64 32) \
WIKI_MCP_PUBLIC_URL=https://wiki.example.com \
WIKI_MCP_HOST=127.0.0.1 \
npm run httpnpm run http runs the compiled dist/http.js, so step 1 above has to have happened.
WIKI_MCP_PUBLIC_URL is the OAuth issuer and must match the URL you give the remote client, minus
the /mcp path. Setting it is what turns OAuth on; without it the entrypoint stays static-bearer
only.
To run it as a service rather than a foreground process, see
deploy/README.md — a hardened systemd user unit, plus the two settings
whose obvious values are the wrong ones.
Redeploying after a source change
The unit runs dist/http.js, which systemd loaded into a long-lived process at start. Building
new output does not touch that process — restart it, or the old code keeps serving:
npm run build
systemctl --user restart wiki-skills-http
systemctl --user status wiki-skills-http --no-pagerThis is a user unit, so --user is required and sudo is wrong — sudo systemctl restart wiki-skills-http looks for a system unit that does not exist. (sudo systemctl restart wiki.service, without --user, is the wiki itself — a different service.)
A restart drops nothing a client will notice: the entrypoint is stateless, with a fresh
McpServer per request, and issued OAuth tokens survive in WIKI_MCP_STATE_FILE. Clients
reconnect on their next call without re-consenting. Only edits to the unit file itself need
systemctl --user daemon-reload first.
The failure this prevents is a quiet one: the connector stays up and answers normally, just with the previous build's tool list — a new tool never appears, and a fixed bug is still there.
2. Put an HTTPS ingress in front
TLS and the public hostname belong to the ingress, not this process. With a Cloudflare Tunnel, point the public hostname at the origin, with no path:
ingress:
- hostname: wiki.example.com
service: http://127.0.0.1:8787If cloudflared runs in a Docker container, 127.0.0.1 there is the container, not your host —
use the bridge gateway (typically http://172.17.0.1:8787) and set WIKI_MCP_HOST to match. Point
the tunnel's health check at /healthz, which is unauthenticated; /mcp answers 405 to GET.
3. Register the MCP app in ChatGPT
Use the ChatGPT Plugins interface in a browser and create an MCP app/connection using:
https://wiki.example.com/mcpThe exact navigation and labels vary by ChatGPT account and workspace. Do not rely on a
Settings → Security and login → Developer mode toggle: it was not present in the account used
for this integration. Likewise, do not manually enter an OAuth client ID, client secret, or API
key. ChatGPT registers itself as a public client and negotiates token_endpoint_auth_method=none.
Complete browser authorization using WIKI_MCP_BEARER as the consent passphrase. Enable the write
scope only if ChatGPT should create and edit pages. After ChatGPT scans the tools, record the
generated technical app ID; it has the form plugin_asdk_app_....
An MCP app exposes tools, but it does not automatically install this repository's authoring skill. Build the upload archive with:
npm run package:chatgpt-pluginThis validates the package and writes dist/ok-wiki-chatgpt-plugin.tar.gz. In ChatGPT's plugin
creator, attach that archive and ask it to create/install a personal plugin from the package. The
checked-in .app.json maps the plugin to the registered technical app ID. Start a new conversation
after installing or updating it so the skill and tools are reloaded.
See docs/chatgpt-plugin-installation.md for the complete
procedure, update workflow, and the OAuth failures encountered during the first installation.
ChatGPT's production OAuth callback is under https://chatgpt.com/connector/oauth/; the server
learns the exact redirect URI through CIMD or dynamic registration and validates it on every OAuth
exchange.
4. Add the connector to claude.ai
In claude.ai, Settings → Connectors → Add custom connector, URL:
https://wiki.example.com/mcpThe /mcp suffix is required. Approve in the browser using WIKI_MCP_BEARER as the passphrase, and
tick Create and edit pages if you want write access — it is unchecked by default, and a
read-only grant publishes 8 tools instead of 15.
Rotating credentials
WIKI_MCP_BEARER guards two doors: it is the header credential and the consent passphrase.
Rotating it closes both but does not invalidate tokens already issued — for that, delete
WIKI_MCP_STATE_FILE, which is the revoke-everything gesture. That file holds the token signing
key, so it lives at mode 0600; the server refuses to start if that has slipped.
Configuration
Variable | Required | Default | Purpose |
| yes | — | e.g. |
| yes | — | ok-wiki API key (JWT) |
| no |
| Default locale |
| no |
| Per-request timeout |
| no |
|
|
| no |
| Cap on page body returned into context |
| no |
| Diagnostics, always to stderr |
| no |
| Max upload size in bytes for |
| no | unset | Colon-separated absolute path prefixes uploads may come from; unset = unrestricted |
| no |
| Bind address for the remote HTTP entrypoint |
| no |
| Listen port for the remote HTTP entrypoint |
| no | unset | Static bearer token for header-auth clients; also the consent passphrase |
| no | unset | Public https:// origin — the OAuth issuer. Unset disables OAuth |
| no |
| OAuth signing key and issued-token state |
| no |
| Hosts whose OAuth client metadata may be fetched; an explicit override must retain every remote client you use |
Development
Command | What it does |
| Compile the shared stdio and HTTP entrypoints into |
| Deterministically rebuild the checked-in self-contained Codex bundle |
| Validate and rebuild |
| Watch-mode stdio server via |
| Full vitest suite, including the doc-consistency tests that pin this README to |
| ESLint, which carries the rule that forbids writing to stdout |
| End-to-end against a live wiki; needs |
| Load a new build into the deployed HTTP connector. |
Documentation
Document | What's in it |
System context, module layout, invariants, request flows, error model, security, testing | |
Codex desktop/CLI plugin packaging, page namespace, authoring modes, and compatibility design | |
Numbered Codex plugin requirements, milestones, acceptance criteria, risks, and rollout plan | |
Developer/QA task pairs, dependency graph, milestone gates, and completion criteria for the Codex plugin | |
Implementation ledger, completed QA evidence, and remaining manual release work | |
Working hosted ChatGPT setup, update procedure, and first-install failure record | |
Every tool's inputs, outputs, and behavior | |
Upstream endpoints, auth, permissions, and the gotchas that shape the design | |
The | |
Survey of how the live wiki is actually written, which is where those conventions came from | |
Running the HTTP entrypoint as a systemd user unit | |
Numbered requirements, milestones, and acceptance criteria — the build plan, decomposed into tasks in | |
Why stdio, why GraphQL, why TypeScript, why read-modify-write, why no deletes, why our own OAuth server |
If you read only one thing before writing code, make it
docs/adr/0004: ok-wiki's pages.update is a full
replace, not a patch, and a naive implementation silently unpublishes pages and drops their tags.
Troubleshooting
Symptom | Cause |
Connector won't connect; no useful error | Something wrote to stdout. Under stdio, stdout is the protocol channel — all logging must go to stderr. |
Tools missing after a source edit | You edited |
A new tool or fix is missing from the remote connector, which is otherwise healthy | The deployed process is still on the previous build. |
Codex still uses old plugin behavior | Re-run |
"API is disabled" | Step 2 not done. |
"API Key is invalid or was revoked" | Key revoked or expired; mint a new one. |
Listing works but fetching a single page is "not authorized" | The key's group is missing |
Page reads succeed but | The key's group is missing |
Edits rejected as conflicts | Someone edited the page after your read. Re-read and retry. |
claude.ai fails at the authorize step |
|
"cannot reach the wiki" | ok-wiki isn't up. It runs as a systemd unit — check |
License
MIT
Available Tools
13 toolswiki_create_asset_folderCreate a wiki asset folderA
Create a new asset folder under a parent folder (parentFolderId 0 = root). If the folder already exists the error says so — reuse the existing folder in that case.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional display name for the folder. Defaults to the slug upstream. | |
| slug | Yes | URL-safe folder slug (lowercase letters, digits, hyphens, underscores), e.g. 'diagrams'. Becomes a segment of asset URLs. | |
| parentFolderId | No | Parent asset folder id. 0 is the root folder (the default). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses key behaviors beyond the basic create action: the root folder default and the idempotency-like error handling (if folder exists, error suggests reuse). It does not cover permissions or return format, but for a create operation these are less critical and the given behavior is valuable.
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 consists of two concise sentences, front-loaded with the primary purpose and followed by a key error-handling note. Every word contributes value, with no redundancy or clutter.
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 and the description covers purpose and main behavioral quirk. However, it does not mention what the tool returns on success (e.g., folder ID or object), which could be important for an agent without an output schema. It also omits any mention of permissions. These gaps lower the score below what would be fully complete for a creation 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 input schema already describes all three parameters fully (slug pattern, parentFolderId default and meaning, name default). The description adds little beyond the schema, aside from reinforcing the root default via 'parentFolderId 0 = root'. Since schema coverage is 100%, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Create') and resource ('asset folder'), and includes the key distinction of a parent folder relationship with 'parentFolderId 0 = root'. This unambiguously differentiates it from sibling tools like wiki_create_page or wiki_upload_asset.
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 usage context: it specifies that the folder is created under a parent, clarifies root semantics, and gives guidance on how to handle the 'already exists' error (reuse the existing folder). It does not explicitly mention alternatives or exclusions, but no direct alternative exists among siblings, so this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_create_pageCreate wiki pageA
Create a new markdown page in the ok-wiki at the given path. The path is validated locally first (no dots, spaces, backslashes, or double slashes). If a page already exists at the path, the error says so and points at wiki_update_page — edit rather than re-create.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Slug path for the new page, e.g. 'projects/my-page'. No dots, spaces, backslashes, or '//' — segments of letters, digits, and hyphens separated by single slashes. | |
| tags | No | Tag slugs to attach to the new page. Prefer existing wiki tags (see wiki_list_tags) over inventing near-duplicates. Defaults to none. | |
| title | Yes | Title of the new page. | |
| content | Yes | Markdown body of the new page. Must not be empty or whitespace-only — ok-wiki rejects empty pages. | |
| isPrivate | No | Whether the page is private. Defaults to false. | |
| description | No | Short description shown in listings and search results. Defaults to empty. | |
| isPublished | No | Whether the page is immediately visible (true, the default) or saved as an unpublished draft (false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses important behaviors: local path validation rules (no dots, spaces, backslashes, double slashes) and the specific error behavior when a page already exists. While it doesn't mention auth or rate limits, the disclosed details are meaningful and go beyond what the name implies.
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 exceptionally concise: two sentences that lead with the core purpose, then add high-value details about path validation and the existing-page error. Every sentence earns its place, with zero waste.
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 has 7 parameters, no output schema, and no annotations, the description is quite complete. It explains the main edge case (existing page) and the path restrictions. While it doesn't describe the return value or all possible side effects, the schema covers parameter semantics, and the description handles the key contextual nuance. This is solid for the complexity level.
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 descriptions for all 7 parameters, so baseline is 3. The description adds minimal extra meaning beyond the schema, only reinforcing the path validation rule. It doesn't elaborate on tag usage or other parameters, but the schema already covers them sufficiently.
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 the exact action ('Create a new markdown page') and resource ('in the ok-wiki at the given path'). It also distinguishes from the sibling tool by noting that existing pages should be edited via wiki_update_page, so it's clear what this tool uniquely does.
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 tells when to use this tool (for new pages) and when not to (if the page exists, use wiki_update_page). It even names the alternative tool, providing strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_get_pageGet a wiki pageA
Fetch a single ok-wiki page — by numeric id or by path (plus locale) — with its metadata and markdown source. The returned updatedAt is the conflict checkout stamp: pass this page to wiki_update_page promptly rather than editing against a stale read. contentTruncated: true means the body was cut at WIKI_MAX_CONTENT_BYTES and is not the full page. Single-page reads require the manage:pages permission, and content requires read:source, on the API key's group.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Numeric page id. Provide exactly one of `id` or `path`, never both. | |
| path | No | Page path, e.g. "projects/my-page". Provide exactly one of `id` or `path`, never both. The path locates the page together with `locale`; it never moves anything. | |
| locale | No | Locale used for path lookup (default: the configured WIKI_LOCALE, "en"). Only meaningful together with `path`. | en |
| includeContent | No | Include the markdown source in the result (default true). Set false for a metadata-only read; the result then omits `content` entirely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It discloses important behavioral traits: updatedAt is a conflict checkout stamp (not just a timestamp), contentTruncated indicates body cut off, and specific permissions (manage:pages and read:source) are required. This goes well beyond a minimal description, though it stops short of detailing error handling or a complete return 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?
Three sentences, front-loaded with the main purpose, followed by critical caveats (conflict stamp, truncation, permissions). Every sentence earns its place 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?
For a read tool with no output schema, the description explains key return fields (updatedAt, contentTruncated, content), the identifier alternatives, and permission requirements. It is sufficiently complete for an agent to invoke correctly, though a fully exhaustive return field list is not included.
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 all four parameters with 100% coverage, including the exactly-one-of rule and locale semantics. The description adds no new parameter-level details beyond reinforcing that path requires locale, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the exact action ('Fetch a single ok-wiki page') and the two lookup modes (numeric id or path+locale). It clearly distinguishes this from sibling list/search tools by emphasizing 'single' page retrieval with metadata and markdown source.
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 usage context: fetch a page when you know its id or path, and pass the result to wiki_update_page to avoid stale edits. It also notes permission prerequisites. However, it does not explicitly enumerate alternatives or when-not-to-use scenarios, though this is implied by the single-page scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_get_page_versionFetch one historical page versionA
Fetch one historical revision of a page as a full snapshot: content, title, description, tags, path, isPublished, versionDate, authorName. Content is bounded by WIKI_MAX_CONTENT_BYTES under the same rule as wiki_get_page — when cut, the result carries an explicit truncation marker and contentTruncated: true. Pair two calls to show a before/after when explaining a change.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Numeric id of the page the version belongs to. | |
| versionId | Yes | Version to retrieve — a `versionId` from wiki_page_history. |
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 reveals that content is bounded by WIKI_MAX_CONTENT_BYTES and that when truncated, the result includes a truncation marker and `contentTruncated: true`. This is valuable transparency beyond what structured fields would show.
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 with no fluff. The first sentence states the action and return fields, the second covers truncation behavior and a usage example. 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 low-complexity tool with two well-documented parameters and no output schema, the description adequately covers return fields, truncation behavior, and a practical use case. It is complete enough for an agent to select and invoke the tool 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 description coverage is 100%, with both parameters (pageId and versionId) already documented. The description adds no extra parameter-level meaning beyond stating that versionId should come from wiki_page_history, which the schema already mentions. 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?
The description clearly states the tool fetches one historical revision of a page as a full snapshot, listing the exact fields returned. It distinguishes from siblings like wiki_get_page (current version) and wiki_page_history (list of versions) by emphasizing 'historical revision' and 'full snapshot'.
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 an explicit use case ('Pair two calls to show a before/after when explaining a change') and references the truncation rule from wiki_get_page, which implicitly differentiates it from the current-page tool. It does not explicitly state when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_list_assetsList wiki assetsA
List the assets (uploaded files) in a wiki asset folder. folderId 0 is the root folder. Returns id, filename, ext, kind, mime, fileSize (bytes), and url per asset; url assumes the root folder — for assets in another folder, prefix its folder path.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by asset kind: 'IMAGE', 'BINARY', or 'ALL' (the default). | ALL |
| folderId | No | Asset folder id. 0 is the root folder (the default) — never null. |
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 the exact return fields (id, filename, ext, kind, mime, fileSize, url) and highlights the URL prefix nuance for non-root folders, which is valuable for agent decision-making. It does not mention error cases or pagination, but for a simple list tool this is acceptable.
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 primary purpose. It packs essential details (return fields, URL nuance) without unnecessary words, earning 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?
Given no output schema, the description sufficiently describes the return values and a key behavioral detail (URL root assumption). It omits potential pagination limits or invalid folder handling, but for a straightforward list tool with two optional parameters, it covers the main needs.
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 fully documents both parameters, so the baseline is 3. The description adds meaningful context beyond the schema by explaining that folderId 0 is the root and that the returned URL assumes the root folder, requiring prefixing for other folders. This enriches the semantics of the folderId parameter.
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 specifies the action ('List') and the resource ('assets in a wiki asset folder'), with additional context that folderId 0 is the root. It inherently distinguishes itself from sibling tools like wiki_list_tags and wiki_list_pages by focusing on uploaded files.
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 clear usage context: it explains how folderId and kind affect results, and notes the URL behavior for non-root folders. It does not explicitly name alternatives, but the tool's unique purpose among the siblings makes when-to-use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_list_pagesList wiki pagesA
Enumerate ok-wiki pages without a search query — for "what's under projects/?" or "what's tagged runbook?". Filters by tag server-side; pathPrefix is a client-side filter over the fetched page of results only. Returns { pages, count }.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Return only pages carrying ALL of these tag slugs. Applied server-side before the limit. | |
| limit | No | Maximum rows the server returns (1-100, default 25). Passed through to the server; `pathPrefix` then filters within these rows. | |
| orderBy | No | Server-side sort column (default UPDATED). | UPDATED |
| direction | No | Server-side sort direction (default DESC — newest first under UPDATED). | DESC |
| pathPrefix | No | Client-side filter: keeps only rows of the fetched page of results whose path starts with this prefix. It filters a page of results, NOT the whole wiki — a page missing from the output may simply be outside the first `limit` rows, so raise `limit` or sort by PATH before concluding a prefix is empty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the transparency burden. It discloses the server-side vs client-side filtering split, the page-of-results limitation, and the return shape ({ pages, count }). The warning that a page may be outside the first `limit` rows is exactly the kind of behavioral nuance needed.
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 states purpose and typical scenarios; the second covers the critical filtering behavior and return shape. 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?
For a list tool with no output schema, the description covers the essential return value ({ pages, count }), explains the key filtering semantics, and flags the limit-related pitfall. It is complete given the tool's complexity and rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100% and baseline is 3, the description adds crucial meaning beyond the schema: it explains that `pathPrefix` filters the fetched page only, not the whole wiki, and that tags are applied server-side before the limit. This elevates parameter understanding significantly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists/enumerates wiki pages and distinguishes it from search: 'without a search query' with concrete use cases ('what's under projects/?' or 'what's tagged runbook?'). The verb '+resource' specificity combined with sibling differentiation earns a 5.
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 frames when to use this tool ('without a search query') and gives real-world examples. It also provides operational guidance about pathPrefix being a client-side filter over only the fetched page, with an explicit caveat to raise limit or sort by PATH before concluding a prefix is empty. This is clear context with implied exclusions from search tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_list_tagsList wiki tagsA
Lists the wiki's entire tag vocabulary as { tags: [{ tag, title }] }, where tag is the slug used when writing pages and title is its display text. Call this before creating or retagging a page so new pages reuse the existing vocabulary instead of inventing near-duplicate tags.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 return format as '{ tags: [{ tag, title }] }' and explains the semantics of 'tag' vs 'title'. It does not mention permissions, errors, or ordering, but for a simple read-only list operation, this is sufficient context beyond what the schema provides (empty 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 two sentences, front-loaded with the core purpose, followed by a clear usage directive. No filler or repetition—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 simple tool with no output schema, the description fully compensates by specifying the return structure, field semantics, and when to invoke it. The guidance about avoiding near-duplicate tags provides important context. No critical information 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?
The tool has zero parameters, so the baseline is 4. The description appropriately focuses on the output format rather than parameter details, which is unnecessary here. It adds value by describing the returned fields and their meaning.
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 function: 'Lists the wiki's entire tag vocabulary' with a specific verb and resource. The word 'entire' distinguishes it from sibling wiki_search_tags, which presumably returns a filtered subset.
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 explicit when-to-use guidance: 'Call this before creating or retagging a page so new pages reuse the existing vocabulary.' However, it does not explicitly name alternatives or state when not to use this tool (e.g., when a quick search is more appropriate), so it misses the full 'when-not/alternatives' criterion for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_page_historyList page historyA
List the revision history of a page: a trail of versions (versionId, versionDate, authorName, actionType — initial/edit/move; a restore shows as an edit here, and the snapshot it created reports action 'restored' via wiki_get_page_version) plus total, the true version count, so a sliced trail is distinguishable from the whole history. Attribution limit: every edit made through this connector is attributed to user id 1 ('API'), the wiki’s synthetic API user — the author column separates agent edits from human ones, but cannot tell one agent session from another. Pass a versionId to wiki_get_page_version to inspect a snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Numeric id of the page whose history to list (from wiki_get_page, wiki_list_pages, or wiki_search_pages). | |
| limit | No | Maximum trail entries per page of results (1-100, default 25). Compare `total` in the result to see whether more exist. | |
| offsetPage | No | Zero-based page of results to return; each page holds `limit` entries. Default 0 — the most recent versions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, and it exceeds expectations. It reveals important quirks: 'a restore shows as an edit here, and the snapshot it created reports action 'restored' via wiki_get_page_version,' and the attribution limitation: 'every edit made through this connector is attributed to user id 1 ('API')... cannot tell one agent session from another.' These are non-obvious behaviors that go beyond typical parameter descriptions.
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, focused paragraph that contains no fluff. It front-loads the core purpose, then efficiently covers output details, behavioral nuances, and a pointer to a related tool. Every clause adds value, and the structure is logical.
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 there is no output schema, the description comprehensively explains the return fields, total count, and edge cases. It also provides guidance on how to drill into a specific version via wiki_get_page_version. For a list-history tool with moderate complexity, this is a fully complete description that covers all necessary 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 coverage is 100% with detailed descriptions for all three parameters (id, limit, offsetPage), giving a baseline of 3. The description adds meaningful context beyond the schema by explaining that `total` in the result is the true version count, which is essential for understanding limit/offset pagination and slice semantics. 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 clearly states the tool's function: 'List the revision history of a page' and enumerates the output fields (versionId, versionDate, authorName, actionType). It explicitly distinguishes this from the sibling tool wiki_get_page_version by noting that versionId should be passed to that tool for snapshot inspection. This is a specific verb+resource with clear sibling differentiation.
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 strong usage context by explaining the meaning of `total` for distinguishing sliced trails from the full history, and it directs users to the alternative tool for snapshot inspection ('Pass a versionId to wiki_get_page_version to inspect a snapshot'). However, it does not explicitly state when NOT to use this tool or provide a full when/when-not structure, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_restore_page_versionRestore a page to an earlier versionA
Roll a page back to an earlier version from its history — the undo for everything else this connector can do. Restoring is non-destructive in the sense that matters: it appends a new version to the page’s history rather than erasing anything, the intermediate edits stay in the trail, and a mistaken restore can itself be restored away. Get the versionId from wiki_page_history, and preview it with wiki_get_page_version before restoring.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Numeric id of the page to roll back. | |
| versionId | Yes | Version to restore the page to — a `versionId` from wiki_page_history. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the transparency burden. It explicitly discloses the non-destructive behavior: 'appends a new version to the page’s history rather than erasing anything,' that intermediate edits remain, and that a mistaken restore can itself be restored. These are behavioral traits not derivable from the tool name or 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 three sentences, each earning its place: purpose, behavioral clarification, and usage workflow. It is front-loaded with the core function and remains concise without 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?
For a simple two-parameter tool with no output schema, the description covers the essential context: what it does, the nature of the operation, and how to obtain the required inputs. It could mention the return format or permissions, but these are not critical for a basic restore operation. The non-destructive nuance is well explained.
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 minimal parameter insight beyond the schema: it reiterates that versionId comes from wiki_page_history, which the schema already states. No additional semantic detail is provided for pageId or versionId.
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 opens with a specific verb+resource: 'Roll a page back to an earlier version from its history.' It also distinguishes the tool from siblings by calling it 'the undo for everything else this connector can do,' making its role unique among the listed 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?
The description gives clear usage context: retrieve the versionId from wiki_page_history and preview with wiki_get_page_version before restoring. It implies the appropriate workflow and positions the tool as a general undo mechanism, though it doesn't explicitly state when not to use it or name alternatives beyond the preview/history tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_search_pagesSearch wiki pagesA
Full-text search across ok-wiki pages — the first tool to reach for when asked about anything in the wiki. Matching is substring-ish, not semantic: the default search engine is a database LIKE scan over title, description, and path, so search for literal words that would appear on the page rather than paraphrases. Returns { results, totalHits, suggestions }; results are capped at limit, while totalHits reports the true match count so you can tell when you are seeing a slice.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Restrict results to pages whose path starts with this prefix, e.g. "projects/". Applied server-side by the search engine. | |
| limit | No | Maximum results to return (1-50, default 10). Applied client-side; `totalHits` still reports the true match count. | |
| query | Yes | Search terms. Matched substring-ish (database LIKE scan), not semantically — use literal words likely to appear in the page title, description, or path. |
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 non-semantic substring matching, the fields searched, the return shape, and the relationship between limit and totalHits. This is substantial and well beyond a minimal disclosure, though it omits potential error cases or rate limits, which are less critical for a search 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 two sentences, front-loaded with purpose, and every clause adds value. It explains behavior, return format, and usage without redundancy, making it highly efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description compensates by specifying the return object fields and the significance of totalHits. It also covers matching behavior, field scope, and usage context, making it complete for a search tool with three parameters. No critical gaps remain.
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. The description reinforces the query semantics (literal words, substring matching) but does not add new parameter meaning beyond what the schema already provides. The limit/totalHits relationship is already documented in the schema, so the description adds marginal value.
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 performs full-text search across wiki pages, with a specific verb ('search') and resource ('ok-wiki pages'). It differentiates from siblings by positioning itself as 'the first tool to reach for when asked about anything in the wiki' and clarifies it matches title, description, and path, distinguishing it from tag-specific search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool ('first tool to reach for') and how to use it effectively (use literal words, not paraphrases). It does not explicitly name alternatives or exclusion cases, but the behavioral guidance is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_search_tagsSearch wiki tagsA
Searches the existing tag vocabulary and returns matching tag slugs as { tags: string[] }. Use it before creating a page to check whether a tag you are about to invent already exists in a near-duplicate form, so pages converge on shared vocabulary.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Tag text to match against the existing vocabulary, e.g. "dep" to find "deployment". Must not be empty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly indicates a read-only search operation and specifies the return format, which is valuable. However, it does not detail matching behavior (e.g., case sensitivity, partial matching) or potential edge cases, though these are minor for a simple search.
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: the first states the core action and output, the second provides valuable usage context. There is no redundancy or filler, and the key information 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?
For a simple 1-parameter read-only search tool, the description gives enough context: purpose, output shape, and when to use it. The lack of an output schema is compensated by the explicit return type, making it largely complete, though minor details like search matching rules are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of the query parameter with a description and example ('dep' to find 'deployment'), so the description does not add parameter semantics beyond the schema. Per the baseline rule for high schema coverage, a score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches the existing tag vocabulary and returns matching tag slugs, with the specific output shape { tags: string[] }. It distinguishes itself from the sibling tool wiki_list_tags by emphasizing 'search' and 'matching' rather than listing, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends using this tool before creating a page to check for near-duplicate tags, which is clear contextual guidance. However, it does not mention when not to use it or propose alternative tools like wiki_list_tags for other scenarios, 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.
wiki_update_pageUpdate wiki pageA
Edit an existing wiki page with a partial patch, safely: the tool reads the current page, checks for concurrent edits, merges only the fields you supply, and writes the complete page back. Everything you do not supply — title, description, tags, published state, publish window, scripts, path, locale — is preserved exactly as read. Note that tags REPLACES the whole tag list. This tool never moves, renames, or deletes a page; an identical no-op patch writes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Numeric id of the page to edit. Provide exactly one of id or path. | |
| path | No | Path of the page to edit, e.g. 'projects/my-page'. Used only to LOCATE the page — this tool never moves or renames a page. Provide exactly one of id or path. | |
| tags | No | Complete new tag list — this REPLACES the page's existing tags with exactly this list; it never adds to what is already there. Include every tag the page should keep. Omit to leave tags unchanged. | |
| title | No | New page title. Omit to keep the current title. | |
| content | No | Full replacement markdown body. Omit to keep the current body unchanged. | |
| description | No | New short description. Omit to keep the current description. | |
| isPublished | No | true to publish, false to unpublish. Omit to keep the current published state. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses how the patch works ('reads the current page, checks for concurrent edits, merges only the fields you supply, and writes the complete page back'), what is preserved, that tags replace the whole list, and that a no-op writes nothing. This is rich, safety-relevant 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?
The description is a single, dense paragraph that front-loads the essential purpose and then explains behavior. Every sentence adds value—covering the patch mechanism, preservation guarantees, tag-replacement caveat, and what the tool doesn't do. No filler or redundant repetition of 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?
The description covers the tool's behavior, safety model, and exclusions comprehensively. It doesn't explicitly state the need to provide exactly one of id or path, though that is captured in the schema parameter descriptions. Also, the mention of preservable fields like 'publish window' and 'scripts' could be slightly confusing since those aren't in the editable parameter set, but overall it's complete enough for correct 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% and each parameter has a description. The tool description adds cross-cutting semantics like the partial-patch merge behavior and preservation rule, which goes beyond individual parameter descriptions. However, the per-parameter meaning is already well covered by the schema, so a 4 rather than 5.
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 opens with 'Edit an existing wiki page with a partial patch, safely,' which is a specific verb+resource+behavior. It also explicitly distinguishes from other operations by stating 'This tool never moves, renames, or deletes a page,' setting it apart from sibling tools like wiki_create_page or wiki_restore_page_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?
It clearly conveys when to use the tool: for editing an existing wiki page with a partial patch. It also provides a when-not by stating it never moves, renames, or deletes. However, it does not explicitly name alternative tools (e.g., 'use wiki_create_page for new pages'), which would warrant a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiki_upload_assetUpload a wiki assetA
Upload a local file to the wiki as an asset and return its id, URL, and a ready-to-paste markdown reference. The file is read from the machine running this server, subject to WIKI_MAX_UPLOAD and WIKI_UPLOAD_ALLOWLIST. The returned url and markdown assume the root folder; for a non-root folderId, prefix the folder path.
| Name | Required | Description | Default |
|---|---|---|---|
| altText | No | Alt text for the returned markdown snippet. Defaults to empty. | |
| filePath | Yes | Absolute path to a file on the machine running this server. | |
| folderId | No | Asset folder id. 0 is the root folder (the default) — never null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the file is on the server, subject to size/allowlist constraints, and that returned URLs/markdown assume root folder. This is substantial behavioral context 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?
Three sentences, each adding distinct value: action+outputs, constraints, and folder-path caveat. 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?
With no output schema, the description names the return values (id, URL, markdown). It covers the main use case and important environmental constraints. It could mention error behavior, but for a simple upload tool with 3 parameters, it is adequately 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 descriptions cover all three parameters (100%), so baseline is 3. The description adds practical nuance about folderId: the returned url/markdown assume root, so non-root requires prefixing the folder path. This goes beyond the schema's simple default explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (upload a local file to the wiki as an asset) and the outputs (id, URL, markdown reference). It distinguishes from sibling tools like wiki_list_assets and wiki_create_asset_folder by focusing on the upload operation.
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?
Description gives context (file read from the server, subject to WIKI_MAX_UPLOAD and WIKI_UPLOAD_ALLOWLIST) and a folder-path caveat. It doesn't explicitly contrast with alternatives, but as the only upload tool among siblings, the intended use is clear.
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.
13 tool updates
v1.0.0- First observed
wiki_create_asset_folder - First observed
wiki_create_page - First observed
wiki_get_page - First observed
wiki_get_page_version - First observed
wiki_list_assets - First observed
wiki_list_pages - First observed
wiki_list_tags - First observed
wiki_page_history - First observed
wiki_restore_page_version - First observed
wiki_search_pages - First observed
wiki_search_tags - First observed
wiki_update_page - First observed
wiki_upload_asset
TDQS
Scored across 13 tools
Most tools target a distinct resource and action (search vs list, current vs version, page vs asset). The two tag tools (list_tags and search_tags) overlap in purpose but their descriptions clearly distinguish batch listing from duplicate-checking, so an agent can separate them. Overall low ambiguity.
All tools share the wiki_ prefix and mostly follow verb_noun (list_tags, get_page, create_page). The one exception is wiki_page_history, which is noun_noun rather than a verb form, making it slightly inconsistent. Otherwise the pattern is predictable.
At 13 tools, the set is well-scoped for a wiki server covering pages, tags, history, and assets. Each tool serves a clear function without redundancy. This is within the ideal range and not overwhelming.
The page lifecycle is incomplete: there is no delete or move/rename tool, and update_page explicitly refuses to do so. Asset support also lacks folder listing, deletion, and update, leaving obvious dead ends. These gaps would cause agent failures when cleanup or reorganization is needed.
Maintenance
Related MCP Connectors
Knowledge base MCP for AI agents on iknow.dev. Search, read, and maintain via OAuth.
Make your knowledge agent-ready. One MCP endpoint, 5 connectors, 3 search modes.
- FlowdexOAuthdk.flowdex
Read and write your team's shared, AI-readable wiki from any MCP client.
The knowledge base your AI reads and writes, under your rules — over MCP, EU-hosted.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP Server implementation that enables managing Confluence wiki pages through natural language queries, supporting operations like creating, updating, deleting, and searching pages across different knowledge bases.2-
- AlicenseAqualityCmaintenanceAn MCP server that enables AI agents to interact with Wiki.js as a knowledge base through a comprehensive set of 29 tools for content retrieval and management. It supports full-text search, page versioning, and asset browsing with optional write operations secured by safety gates.2912 npm6MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables full management of WikiJS instances, supporting operations like page creation, searching, and updating. It also provides tools for knowledge graph exploration, content summarization, and retrieval of wiki statistics.9 npmMIT
- FlicenseNot gradedqualityCmaintenanceConnects AI assistants to a team's product knowledge base, enabling search, capture, and navigation of glossary terms, business rules, decisions, and relations via MCP.13,075 npm-