{
  "markdown": "# wikijs-mcp\n\n<!-- badges: start -->\n\n[![CI](https://img.shields.io/github/actions/workflow/status/ni-c/wikijs-mcp/ci.yml?branch=main&label=CI)](https://github.com/ni-c/wikijs-mcp/actions/workflows/ci.yml)\n[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/ni-c/wikijs-mcp/badge)](https://scorecard.dev/viewer/?uri=github.com/ni-c/wikijs-mcp)\n<a href=\"https://socket.dev/npm/package/@ni-c/wikijs-mcp\"><img src=\"https://socket.dev/api/badge/npm/package/@ni-c/wikijs-mcp\" alt=\"Socket supply-chain report\" height=\"20\"></a>\n[![Glama score](https://glama.ai/mcp/servers/ni-c/wikijs-mcp/badges/score.svg)](https://glama.ai/mcp/servers/ni-c/wikijs-mcp)\n<br>\n[![npm version](https://img.shields.io/npm/v/%40ni-c%2Fwikijs-mcp)](https://www.npmjs.com/package/@ni-c/wikijs-mcp)\n[![container image](https://img.shields.io/badge/ghcr.io-ni--c%2Fwikijs--mcp-4f46e5?logo=docker&logoColor=white)](https://github.com/ni-c/wikijs-mcp/pkgs/container/wikijs-mcp)\n[![HTTP via mcp-hub](https://img.shields.io/badge/HTTP-via%20mcp--hub-4f46e5?logo=modelcontextprotocol&logoColor=white)](https://mcp-hub.ni-c.de)\n<br>\n[![docs](https://img.shields.io/badge/docs-wikijs--mcp.ni--c.de-4f46e5?logo=readthedocs&logoColor=white)](https://wikijs-mcp.ni-c.de)\n[![sponsor](https://img.shields.io/badge/sponsor-ni--c-ea4aaa?logo=githubsponsors&logoColor=white)](https://github.com/sponsors/ni-c)\n<!-- badges: end -->\n\n<!-- The opening is three paragraphs in a fixed shape: what it IS, what it LETS A\n     CLIENT DO, and how to make it smaller. Keep \"Lets MCP clients like Claude Code,\n     Claude Desktop or Codex …\" verbatim — the family drifted into \"It lets an AI\n     assistant\", \"It gives a model\" and \"This server speaks\" before it was pinned.\n\n     There is NO standalone \"Full documentation\" line. The docs badge above links\n     to the same page; the line existed in five different spellings and said\n     nothing the badge did not. -->\n\nA [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server for\n[Wiki.js](https://js.wiki), the self-hosted wiki that keeps its pages as markdown and exposes everything through one GraphQL endpoint.\n\nLets MCP clients like Claude Code, Claude Desktop or Codex search, read and edit wiki pages — and, if you let them, manage its assets, comments, users, groups and maintenance jobs.\n\nSixty-two tools is the ceiling, not the floor:\n`WIKIJS_ALLOW_TOOLS=essential` registers a curated seven\ninstead, and a model picks the right tool far more reliably from\nseven than from sixty-two — see\n[choosing which tools load](#choosing-which-tools-load).\n\n<!-- <picture> is resolved against the colour scheme of the page showing it, so GitHub\n     picks the variant that matches its own theme toggle. npm strips <picture> and\n     <source> when it sanitises the README and keeps the <img>, which is why that\n     fallback brings its own dark card instead of relying on a media query.\n     All three URLs must stay absolute: npm does not resolve repo-relative paths. -->\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://wikijs-mcp.ni-c.de/architecture-dark.svg\">\n  <source media=\"(prefers-color-scheme: light)\" srcset=\"https://wikijs-mcp.ni-c.de/architecture-light.svg\">\n  <img src=\"https://wikijs-mcp.ni-c.de/architecture.svg\" alt=\"An MCP client talking to wikijs-mcp over stdio, which calls the Wiki.js GraphQL endpoint\" width=\"800\">\n</picture>\n\n<!-- Absolute, like the diagram: npm does not resolve repo-relative paths, and a\n     recording nobody sees is a recording that was not worth making. -->\n<img src=\"https://wikijs-mcp.ni-c.de/demo.gif\" alt=\"Searching a wiki for text the built-in search cannot find, then being refused an ambiguous edit\" width=\"800\">\n\n## What makes it different\n\n**Finds text search cannot.** Wiki.js' default engine indexes titles and\ndescriptions only — so `search_pages` says which engine is running, and\n`grep_pages` searches the actual text of pages.\n\n**Will not clobber a colleague.** `update_page` compares against the moment you\nread the page and refuses to overwrite an edit saved in between. Surgical edits\nmust match exactly once.\n\n**Writes can be confined to part of the wiki.** `WIKIJS_ALLOWED_PATHS` limits the\nwriting page and asset tools to path prefixes, matched by path segment, while\nreads stay unrestricted.\n\n## Requirements\n\n- Node.js ≥ 22\n- A running **Wiki.js** instance and an API token\n\n## Configuration\n\n| Variable               | Required | Description                                                                                |\n| ---------------------- | -------- | ------------------------------------------------------------------------------------------ |\n| `WIKIJS_URL`           | yes      | Base URL of the wiki, e.g. `https://wiki.example.com`. A trailing `/graphql` is trimmed    |\n| `WIKIJS_TOKEN`         | yes      | API key from Administration → API Access. `WIKIJS_API_KEY` is accepted as an alias         |\n| `WIKIJS_LOCALE`        | no       | Locale assumed by page tools that are not given one (default `en`)                         |\n| `WIKIJS_READ_ONLY`     | no       | `true`, `1` or `yes` registers only the read tools                                         |\n| `WIKIJS_ALLOWED_PATHS` | no       | Comma-separated page path prefixes the write tools are confined to, e.g. `docs,team/notes` |\n| `WIKIJS_ALLOW_TOOLS`   | no       | Comma-separated tool names, `list_*` prefixes, or `essential` for a curated preset         |\n| `WIKIJS_DENY_TOOLS`    | no       | Same syntax; removed from whatever `WIKIJS_ALLOW_TOOLS` left                               |\n| `ELICITATION`          | no       | `false` replaces the approval dialog with the two-call token. **Not prefixed**             |\n| `WIKIJS_INSECURE_TLS`  | no       | `true` accepts self-signed certificates (scoped to this connection)                        |\n\n**The locale is part of a page's identity**, not a display preference: the same path\nunder `en` and `de` is two different pages. On a wiki set up in another language,\nset `WIKIJS_LOCALE` or every lookup by path answers \"not found\". `list_locales`\nreports what is installed.\n\n**API keys are administrative.** Wiki.js offers \"full access\" or a group, and a\nfull-access key can rewrite every page and every account. `WIKIJS_READ_ONLY`,\n`WIKIJS_ALLOWED_PATHS` and the key's own group permissions are three independent\nways to narrow that — see [SECURITY.md](SECURITY.md).\n\n> **Use `https://`.** Over plain http the token travels unencrypted; the server\n> prints a warning unless the host is local. For self-signed certificates prefer a\n> proper internal CA over `WIKIJS_INSECURE_TLS`.\n\nWithout credentials the server still starts and lists its tools (so registries and\ninspectors can introspect it), but every call fails with setup instructions instead\nof reaching the API.\n\n### Choosing which tools load\n\n<!-- This heading is the anchor the opening paragraph links to. Keep the wording:\n     it has to be #choosing-which-tools-load in every repository. -->\n\n`WIKIJS_ALLOW_TOOLS` and `WIKIJS_DENY_TOOLS` take comma-separated\ntool names; a trailing `*` matches a whole family. `essential` is a curated preset —\n`search_pages`, `grep_pages`, `get_page`, `list_pages`, `get_page_tree`, `create_page` and `update_page`, which is what it takes to find, read and write a wiki page end to end — marked as such in the\n[tool reference](https://wikijs-mcp.ni-c.de/reference/tools).\n\n```sh\nWIKIJS_ALLOW_TOOLS=essential\nWIKIJS_ALLOW_TOOLS=get_page,search_pages,list_*\nWIKIJS_DENY_TOOLS=delete_*,purge_page_history,set_api_state\n```\n\nAn entry that matches no tool aborts startup and names it, so a typo cannot silently\nhide a tool — an absent tool is not something anyone traces back to an environment\nvariable. A filtered tool is never registered, so it is absent from `tools/list` and\nunknown to `tools/call` alike, exactly like a write tool under\n`WIKIJS_READ_ONLY`.\n\nIf you run several of these servers at once, [mcp-hub](https://mcp-hub.ni-c.de) is\nthe other answer — its `/hub` endpoint replaces every server's tools with six\nmeta-tools.\n\n### Confining writes to part of the wiki\n\n`WIKIJS_ALLOWED_PATHS` limits the writing page and asset tools to a set of path\nprefixes. Reads stay unrestricted, deliberately: a scope on reads turns a wiki into\na confusing half-wiki, and the API key's own page rules are the right place to hide\npages outright — they hide them from the web UI too.\n\n```sh\nWIKIJS_ALLOWED_PATHS=docs,team/notes\n```\n\nMatching is by path segment, so `docs` covers `docs/setup` and **not**\n`docs-archive/old`. `move_page` checks both ends, so a page cannot be moved out of\nthe allowed area or into a protected one.\n\nAsset writes are checked against the asset folder tree, which is a separate\nnamespace. The operations that cannot be confined to a prefix at all — all six\ninstance-wide maintenance tools, the tag tools, and comment edits, because\nWiki.js does not say which page a comment is on — refuse while the variable is\nset rather than making a silent exception. That includes `flush_page_cache`,\n`rebuild_page_tree` and `rebuild_search_index`, which lose nothing but still act\non the whole wiki.\n\n## Installation\n\n### Claude Code\n\n```sh\nclaude mcp add wikijs-mcp -- npx -y @ni-c/wikijs-mcp\n```\n\n### Claude Desktop\n\n```json\n{\n  \"mcpServers\": {\n    \"wikijs-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@ni-c/wikijs-mcp\"],\n      \"env\": {\n        \"WIKIJS_URL\": \"https://wiki.example.com\",\n        \"WIKIJS_TOKEN\": \"…\"\n      }\n    }\n  }\n}\n```\n\n### Codex\n\n```toml\n[mcp_servers.wikijs-mcp]\ncommand = \"npx\"\nargs = [\"-y\", \"@ni-c/wikijs-mcp\"]\nenv = { WIKIJS_URL = \"https://wiki.example.com\", WIKIJS_TOKEN = \"…\" }\n```\n\n### Docker\n\n```sh\ndocker run --rm -i \\\n  -e WIKIJS_URL=https://wiki.example.com \\\n  -e WIKIJS_TOKEN=… \\\n  ghcr.io/ni-c/wikijs-mcp\n```\n\n### Through mcp-hub\n\nA client that cannot spawn a local process — ChatGPT connectors, Claude on the web,\nCursor, LibreChat — reaches wikijs-mcp through [mcp-hub](https://mcp-hub.ni-c.de): one\ncontainer serves many stdio MCP servers over Streamable HTTP, with an OAuth 2.1 login\nbehind a single password and long-lived tokens for the clients that cannot do OAuth. Its\n`/hub` endpoint puts every server behind six meta-tools, so one connector reaches all of\nthem without N×tool schemas in the model's context, and it speaks both protocol revisions\n— a question this server asks travels through it to the person at the far end.\n\nIts `/config/mcp.json` uses Claude Code's format, so the entry is the one you already\nhave:\n\n```json\n{\n  \"mcpServers\": {\n    \"wikijs-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@ni-c/wikijs-mcp\"],\n      \"env\": {\n        \"WIKIJS_URL\": \"https://wiki.example.com\",\n        \"WIKIJS_TOKEN\": \"…\",\n        \"WIKIJS_ALLOW_TOOLS\": \"essential\"\n      },\n      \"denyTools\": [\"delete_*,purge_page_history,set_api_state\"]\n    }\n  }\n}\n```\n\n`allowTools` and `denyTools` there are the hub's **own** per-server filter, which is not\nthe same thing as `*_ALLOW_TOOLS` in `env` — the difference, and the mistake it invites,\nare in the [client guide](https://wikijs-mcp.ni-c.de/guide/clients#through-mcp-hub).\n\n## Tools\n\n62 tools. ★ marks the `essential` preset; ⚠ marks a tool that **asks a person**\nthrough MCP elicitation — a dialog the model cannot answer on its behalf, falling\nback to a two-call `confirm_token` where the client cannot show one. See\n[Asking a person](https://wikijs-mcp.ni-c.de/guide/approval).\n\nEvery tool declares an `outputSchema` and answers with `structuredContent`\nalongside the text block, so a client can use the result without parsing prose.\nTwenty-nine tools that answered with a sentence — _\"Deleted page 5 (path).\"_ —\nnow answer with the fields as well, and the sentence stays where a reader wants\nit.\n\nThe tools that report wiki content carry `untrusted: true` and\n`source: \"wikijs\"` as fields; page text, titles, descriptions and comments are\nwritten by anyone with edit rights. The list follows the call sites: a tool is\nmarked exactly when it already routed its answer through the untrusted wrapper.\n\n`update_page`'s stale-read refusal keeps its shape as a deliberate exception —\nit stays an ordinary result rather than an error, because it is an instruction\nfor recovering rather than a failure, and it now says `written: false` with both\ntimestamps in fields.\n\n| Tool                       | Description                                                                                                                                                                         |\n| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `list_pages`               | ★ Lists pages with their metadata, newest first by default.                                                                                                                         |\n| `get_page`                 | ★ Reads one page, addressed by page_id or by path plus locale.                                                                                                                      |\n| `search_pages`             | ★ Full-text search — but read this first: on a default Wiki.js the search engine is \"Database - Basic\", which only indexes page titles and descriptions, NOT the text inside pages. |\n| `grep_pages`               | ★ Searches the actual text of pages with a regular expression, by fetching them and matching locally.                                                                               |\n| `get_page_tree`            | ★ Lists the pages and folders directly under a path — the structural view a wiki has and a search does not.                                                                         |\n| `list_page_links`          | Returns every page together with the internal links it contains — the wiki’s link graph for one locale.                                                                             |\n| `create_page`              | ★ Creates a page.                                                                                                                                                                   |\n| `update_page`              | ★ Changes a page.                                                                                                                                                                   |\n| `move_page`                | Moves a page to another path, another locale, or both.                                                                                                                              |\n| `delete_page`              | ⚠ Deletes a page and its history.                                                                                                                                                   |\n| `convert_page_editor`      | Changes the storage format of a page.                                                                                                                                               |\n| `list_page_history`        | Lists the stored versions of a page, newest first, with who changed what and when.                                                                                                  |\n| `get_page_version`         | Returns a single historical version of a page, including its full body as it was then.                                                                                              |\n| `diff_page_versions`       | Returns a unified diff between two versions of a page — or between one version and the page as it is now, if to_version is omitted.                                                 |\n| `get_page_conflict`        | Returns the version of a page that is newer than the one you read — what update_page points at when it refuses to write.                                                            |\n| `restore_page_version`     | Rolls a page back to a stored version.                                                                                                                                              |\n| `list_tags`                | Every tag in the wiki, with its display title and when it was last used.                                                                                                            |\n| `search_tags`              | Finds tags matching a fragment.                                                                                                                                                     |\n| `update_tag`               | Changes a tag’s name or display title across every page carrying it.                                                                                                                |\n| `delete_tag`               | ⚠ Removes a tag from the wiki and from every page that carries it.                                                                                                                  |\n| `list_assets`              | Lists the images and files in one asset folder.                                                                                                                                     |\n| `list_asset_folders`       | Lists the folders directly under an asset folder.                                                                                                                                   |\n| `upload_asset`             | Uploads an image or file to an asset folder, so it can be embedded in a page.                                                                                                       |\n| `create_asset_folder`      | Creates a folder in the asset store.                                                                                                                                                |\n| `rename_asset`             | Renames an asset.                                                                                                                                                                   |\n| `delete_asset`             | ⚠ Deletes an asset permanently.                                                                                                                                                     |\n| `list_comments`            | Returns the comments on one page, addressed by path and locale — not by page id, which is the one place Wiki.js asks for the path instead.                                          |\n| `get_comment`              | Returns a single comment by id, with its source and its rendered HTML.                                                                                                              |\n| `create_comment`           | Posts a comment on a page, optionally as a reply to another.                                                                                                                        |\n| `update_comment`           | Replaces the body of a comment.                                                                                                                                                     |\n| `delete_comment`           | ⚠ Removes a comment permanently.                                                                                                                                                    |\n| `list_users`               | Lists the wiki’s user accounts.                                                                                                                                                     |\n| `search_users`             | Finds users by name or email.                                                                                                                                                       |\n| `get_user`                 | Full detail for one account, including its group memberships and whether two-factor authentication is active.                                                                       |\n| `create_user`              | Creates an account.                                                                                                                                                                 |\n| `update_user`              | Changes an account’s details or its group membership.                                                                                                                               |\n| `delete_user`              | ⚠ Removes an account.                                                                                                                                                               |\n| `set_user_active`          | Switches an account on or off.                                                                                                                                                      |\n| `verify_user`              | Marks an account’s email as verified, which is otherwise done by the user clicking a link.                                                                                          |\n| `set_user_tfa`             | Switches an account’s second factor.                                                                                                                                                |\n| `reset_user_password`      | Starts Wiki.js’ own password reset for a local account, which emails the user a link.                                                                                               |\n| `list_groups`              | Lists the wiki’s groups with how many users each has.                                                                                                                               |\n| `get_group`                | Returns one group with its global permissions, its page rules and its members.                                                                                                      |\n| `create_group`             | Creates an empty group.                                                                                                                                                             |\n| `update_group`             | Replaces a group’s name, permissions and page rules wholesale — this is not a partial update, and omitting a rule deletes it.                                                       |\n| `delete_group`             | ⚠ Removes a group.                                                                                                                                                                  |\n| `assign_user_to_group`     | Adds one account to one group, leaving its other memberships alone — the additive counterpart to update_user’s groups list.                                                         |\n| `unassign_user_from_group` | Takes one account out of one group.                                                                                                                                                 |\n| `get_site_info`            | Version, database, host summary and the site’s own title and description, plus totals for pages, users, groups and tags.                                                            |\n| `list_locales`             | Which locales are installed and which one is the default.                                                                                                                           |\n| `get_navigation_tree`      | The sidebar navigation as configured, per locale.                                                                                                                                   |\n| `list_search_engines`      | Which search engine this wiki uses.                                                                                                                                                 |\n| `list_api_keys`            | Lists the wiki’s API keys with their expiry and whether they are revoked, plus whether API access is switched on at all.                                                            |\n| `list_storage_targets`     | The configured storage backends — git mirrors, S3 buckets, local file dumps — with their sync status and last error.                                                                |\n| `revoke_api_key`           | ⚠ Revokes an API key immediately and for good — Wiki.js has no way to un-revoke one.                                                                                                |\n| `set_api_state`            | ⚠ Switches Wiki.js’ whole API on or off.                                                                                                                                            |\n| `render_page`              | Forces Wiki.js to regenerate one page’s HTML from its source.                                                                                                                       |\n| `flush_page_cache`         | Drops Wiki.js’ rendered-page cache for the whole wiki.                                                                                                                              |\n| `rebuild_page_tree`        | Recomputes the folder structure Wiki.js derives from page paths.                                                                                                                    |\n| `rebuild_search_index`     | Reindexes every page in the active search engine.                                                                                                                                   |\n| `purge_page_history`       | ⚠ Deletes stored page versions older than a cutoff, across the whole wiki.                                                                                                          |\n| `migrate_pages_locale`     | ⚠ Moves all pages from one locale to another, across the whole wiki.                                                                                                                |\n\nThe full reference, with every parameter, is at\n[wikijs-mcp.ni-c.de/reference/tools](https://wikijs-mcp.ni-c.de/reference/tools).\n\n### Two things worth knowing before you use `search_pages`\n\n**Wiki.js' default search engine does not index page content.** \"Database - Basic\"\nmatches titles and descriptions only, so searching for a phrase written inside a\npage returns nothing at all. `search_pages` reports which engine is active and says\nso; `grep_pages` fetches pages and matches their text locally, which is slower and\nactually finds things. Switching the wiki to the PostgreSQL or Elasticsearch engine\nand running `rebuild_search_index` fixes it properly.\n\n**`update_page` refuses to overwrite somebody else's edit.** It compares the page\nagainst the moment _you_ read it, not against its own read a millisecond earlier,\nso an edit saved from the web UI while the model was thinking is caught rather than\nsilently discarded. `get_page_conflict` shows the newer version; `force: true`\noverwrites on purpose.\n\n## Not exposed, on purpose\n\n**No tool that creates an API key.** Wiki.js can do it over GraphQL, and this\nserver deliberately cannot: a model able to mint a full-access key could grant\nitself everything the three narrowing mechanisms above take away.\n\n**Reads are never path-scoped.** `WIKIJS_ALLOWED_PATHS` confines writes only — a\nscope on reads turns a wiki into a confusing half-wiki, and the key's own group\nand page rules are the right place to hide pages, because they apply to\neverything else using that key too.\n\n## Safety\n\n- **Destructive and administrative tools ask a person.** Where the client supports\n  MCP elicitation they raise a real dialog that the model cannot answer on its\n  behalf. Where it does not, the first call returns a short-lived token bound to the\n  exact target and only a second call carrying it performs the operation — which\n  proves the call was made twice with the same arguments and nothing more, and the\n  text says so. The binding includes everything that decides _what_ is touched — an\n  approval for `migrate_pages_locale` from `de` to `en` will not run `en` to `de`.\n  `ELICITATION=false` takes the fallback deliberately; it never removes the guard.\n- **Three maintenance tools are deliberately not gated.** `flush_page_cache`,\n  `rebuild_page_tree` and `rebuild_search_index` cost time, not content. A dialog in\n  front of an operation that loses nothing is how people learn to tick without\n  reading.\n- **Confirmation prompts never quote content from Wiki.js.** Page titles and\n  descriptions are written by anyone with edit rights, and that text is read by a\n  model. Only ids, paths and server-side values appear, and a path is checked to be\n  an identifier before it is interpolated.\n- **Returned page content is marked as untrusted data**, because a wiki is exactly\n  a place where text is stored to be read later.\n- **There is no tool that creates an API key**, although the Wiki.js API offers\n  one: a model able to mint a full-access key could grant itself administrative\n  access that outlives this session. `list_api_keys` and `revoke_api_key` are here\n  so keys can be audited and taken away.\n- Credentials are deleted from the environment after startup, secrets in API\n  responses are redacted, error bodies are truncated and HTML error pages dropped.\n- `WIKIJS_READ_ONLY=true` does not register the write tools at all, and\n  `WIKIJS_DENY_TOOLS` cuts finer along the same line — a filtered tool is never\n  built, not refused at call time.\n\n## Documentation\n\nThe full guide, tool reference and security notes live at\n**[wikijs-mcp.ni-c.de](https://wikijs-mcp.ni-c.de)** (source in [`docs/`](docs/)).\n\n## Development\n\n```sh\nnpm install\nnpm run lint && npm run typecheck && npm run build && npm test\n```\n\nThe unit suite drives the built server over the real MCP protocol against a fake\nWiki.js, so no instance is needed; `npm run test:integration` is the separate\nsuite that brings a real Wiki.js up in Docker and exercises every tool against it.\nThe architecture diagram and social card are generated — edit\n`docs/assets/architecture.source.svg` and run `npm run assets`, never the rendered\ncopies — and `npm run docs:tools` regenerates the tool reference from the\ncatalogue.\n\n## Releasing\n\n1. Add the CHANGELOG entry and bump `package.json`.\n2. `npm run lint && npm run build && npm run test:coverage`\n3. Commit, then push a signed tag: `git tag -s vX.Y.Z -m \"vX.Y.Z\" && git push origin main vX.Y.Z`\n\nThe release workflow publishes to npm (Trusted Publishing, with provenance), creates\nthe GitHub release from the CHANGELOG section and updates the MCP Registry entry.\n\n## Contributing\n\nIssues, discussions and pull requests are welcome — see\n[CONTRIBUTING.md](CONTRIBUTING.md). For vulnerabilities please use\n[private reporting](https://github.com/ni-c/wikijs-mcp/security/advisories/new)\nrather than a public issue; the policy is in [SECURITY.md](SECURITY.md).\n\n## License\n\n[MIT](LICENSE) © Willi Thiel\n",
  "bytes": 30931,
  "sha": "de5edb308b8280a55ec55b28b4ab9e1f8e50baf4a75013a40ec8224a5c4635f4",
  "repo_slug": "ni-c/wikijs-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_ni_c_wikijs_mcp_111bfeaa/readme"
}