tibiawiki-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tibiawiki-mcpwhich creatures are weak to fire and give over 500 experience?"
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.
tibiawiki-mcp
An offline MCP server for TibiaWiki. It answers the questions the wiki itself cannot:
Which creatures are weak to fire and give over 500 experience?
What drops a Dragon Shield, and how likely is it?
Where do I buy a Steel Helmet, and for how much?
The server makes no network calls. Every answer comes from a local SQLite snapshot you build yourself, so queries return in milliseconds and work offline.
Why it exists
TibiaWiki runs on Fandom without Cargo, Semantic MediaWiki or CirrusSearch, so there is
no way to query it by attribute — every structured value is trapped inside Infobox
wikitext, and the built-in search returns Dragon Necklace for fire resistant dragon.
The public REST API over the same wiki exposes exactly one query parameter. Building a
local index is the only way to ask a real question, and it costs about three minutes.
Related MCP server: anydocs
Requirements
Node ≥ 22.13 to run it (
node:sqlitelanded in 22.5 and is unflagged from 22.13).Node ≥ 22.18 to develop it — the test suite runs TypeScript directly, and type-stripping is only on by default from 22.18. Consumers are unaffected: the published package ships compiled JavaScript.
uvto build the index.
Install
pnpm add -g @tibia.sh/tibiawiki-mcp
tibiawiki-mcp build-index # ~3 minutes, ~14 MBUse with Claude Code
Two ways, and they ship different things.
As an MCP server only — the npm package:
claude mcp add --transport stdio tibiawiki -- npx -y @tibia.sh/tibiawiki-mcpAs a plugin — the server plus a skill that teaches an agent how to query it
(name resolution, the 100-is-neutral modifier convention, the data quirks that
produce wrong answers). The plugin pieces never reach the npm tarball, because
package.json has files: ["dist", "data/spell-areas.json"].
Marketplace install is not supported yet.
.mcp.jsonpoints at${CLAUDE_PLUGIN_ROOT}/dist/index.js,dist/is deliberately not committed, and Claude Code does not run a build or apnpminstall for a plugin it fetches. A marketplace or baregit cloneinstall therefore starts with no server. Use the local checkout below, which builds first. Shippingdist/or publishing a prebuilt bundle would fix this and is not done here.
git clone https://github.com/tibia-sh/tibiawiki-mcp
cd tibiawiki-mcp && pnpm install && pnpm build # dist/ is gitignored, so build once
claude --plugin-dir .The build step is not optional: dist/ is deliberately not committed, and
.mcp.json points at ${CLAUDE_PLUGIN_ROOT}/dist/index.js. A freshly cloned plugin
without it will fail to start.
What the skill adds
The MCP server alone gives an agent the tools. The bundled skill gives it the judgement to use them well — and it costs one line of context until it fires:
resolve approximate names with
tibia_searchbeforetibia_getmodifiers are percentages where 100 is neutral, so a Dragon at
modifier_fire: 0is immune to fire, not weak to ithitpoints: nullmeans unrecorded, not zero — 433 creatures have no recorded healthimbuement.slotsis a category list, not a countnon-active pages are hidden unless
include_inactive: true
Tools
Tool | Answers |
| "Is there a page called roughly X?" |
| "Tell me everything about X." — creature, item, NPC, quest or spell |
| "Which creatures match these stats?" |
| "Which items match these stats?" |
| "Where do I get X?" — drops, vendors and quest rewards in one call |
Damage modifiers are percentages where 100 is neutral: above 100 the creature takes
extra damage from that element. weak_to and resistant_to encode that for you.
Deprecated, event-only and unavailable pages are excluded by default; pass
include_inactive: true to see them.
Refreshing
Re-run tibiawiki-mcp build-index. A failed rebuild never replaces a working index —
the new one is validated before it is installed. Every tool response reports
indexGeneratedAt, so staleness is always visible to whoever is asking.
The index lives at $TIBIAWIKI_MCP_DB, or ${XDG_CACHE_HOME:-~/.cache}/tibiawiki-mcp/tibiawiki.db.
Checking for upstream drift
Spell area shapes are decoded once and committed to data/spell-areas.json. To find
out whether TibiaWiki has re-uploaded any of the source animations since:
pnpm decode-spell-areas <path-to-index.db> --checkIt fetches metadata only, prints any image whose revision moved (and any new
candidate the file has never seen), and exits non-zero if there is drift — so it can
run on a schedule. Re-run without --check to regenerate.
Releases
Releases go to npm as @tibia.sh/tibiawiki-mcp, starting at 0.1.0.
The version number describes the server, not the data. The index it serves is a local snapshot you build yourself, so upgrading the package never refreshes it — see Refreshing.
The tarball ships exactly dist/ and data/spell-areas.json, plus the package.json,
README.md and LICENSE npm always adds; npm pack --dry-run is the check that
nothing else leaks in.
Attribution
Data from TibiaWiki (https://tibia.fandom.com), licensed CC BY-SA. Tibia is made by CipSoft; game content and images are copyright CipSoft GmbH.
The index is generated by tibiawiki-sql (Apache-2.0). Images are deliberately never fetched or stored.
This project's own code is MIT licensed; see LICENSE. That covers the code only — the
data it serves is CC BY-SA and not ours to relicense.
Available Tools
5 toolstibia_find_creaturesCRead-only
UNAVAILABLE: the local TibiaWiki index is missing or unusable, so tibia_find_creatures cannot answer anything until it is built.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely new behavioral information by disclosing the tool's current unusable state and its cause (missing/unusable local index). It stops short of saying what the agent will actually receive on invocation (error vs. empty result) or how to fix the index.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with 'UNAVAILABLE' so the critical fact is unmissable. It is appropriately sized for the amount of information it chooses to convey, though it wastes a few words restating the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, output-schema-less tool the description would normally need little, but here it is the only signal that the tool is out of service and it provides no remediation path, no statement of what the agent will get on a call, and no pointer to the sibling tools that could answer the same question.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, which is the baseline-4 case; there are no parameter semantics for the description to explain or compensate for.
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 only tells the agent the tool is broken; it never states what tibia_find_creatures actually does in a working state (presumably looking up creatures in TibiaWiki). The name carries essentially all of the purpose information, and the text is a status notice rather than a purpose statement.
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 implies the tool should not be called right now ('cannot answer anything until it is built'), which is useful, but it names no alternative even though tibia_search, tibia_get, and tibia_find_items exist as potential fallbacks, and gives no condition under which the tool becomes usable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tibia_find_itemsCRead-only
UNAVAILABLE: the local TibiaWiki index is missing or unusable, so tibia_find_items cannot answer anything until it is built.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description does add one genuinely useful behavioral fact beyond the annotations: the tool is currently non-functional because the local index is missing, plus the unmet prerequisite (index must be built). It discloses nothing else about query behavior, limits, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with 'UNAVAILABLE,' which is the right priority order for an agent. It is not bloated, but it is sparse to the point of under-specification rather than efficient concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with annotations covering safety and no output schema, the description still needs to convey what the tool returns and how it differs from tibia_search/tibia_find_creatures. It delivers only an availability warning and no remediation path or fallback, leaving an agent unable to plan around the failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is trivially empty with no descriptions needed, so the baseline of 4 applies. The description neither helps nor harms here, though it also never indicates what input the tool would take once operational.
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 text only reports a runtime status ('index is missing or unusable') and never states what tibia_find_items does when it is available. An agent can infer 'find items' solely from the tool name, and cannot distinguish it from siblings like tibia_search or tibia_find_creatures based on this description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, and no alternative is offered for the unavailable case even though tibia_search and tibia_get are viable siblings. The only actionable signal is a blanket 'cannot answer anything,' which is effectively a do-not-call notice with no fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tibia_getCRead-only
UNAVAILABLE: the local TibiaWiki index is missing or unusable, so tibia_get cannot answer anything until it is built.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds a genuine operational fact beyond them: the backing TibiaWiki index is missing, so every call will fail. That is useful availability disclosure, though it says nothing about failure modes, cost, or what happens once the index exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the critical status ('UNAVAILABLE') in the first word and no filler. It is appropriately sized for the message it carries, though the message itself is thin.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An agent reading this knows not to call tibia_get, but is left without a next step: no sibling is suggested and no hint is given about how the index gets built. For a tool that is unusable, routing guidance is the one thing the description most needs to provide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is trivially complete, so there is nothing for the description to disambiguate. Baseline 4 applies for a no-parameter tool.
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 never states what tibia_get actually retrieves (a page, entity, or record) — it only reports its own unavailability. It effectively restates the tool name and an error state rather than naming a verb+resource, so an agent cannot tell what the tool would do even once the index is built.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a negative condition ('cannot answer anything until it is built'), which implies the tool should not be called now, but it names no alternative among the four siblings (tibia_search, tibia_find_creatures, tibia_find_items, tibia_how_to_obtain) and no positive when-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tibia_how_to_obtainCRead-only
UNAVAILABLE: the local TibiaWiki index is missing or unusable, so tibia_how_to_obtain cannot answer anything until it is built.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a safe read-only, non-open-world operation, and the description adds a critical fact those annotations do not carry: the tool is currently non-functional. However it does not say what a call actually returns in this state (error, empty result, or refusal), so the failure mode remains unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the 'UNAVAILABLE' status, which is the most important thing an agent needs to know. No wasted words, though the sentence is really a status banner rather than a tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description is adequate in flagging that it cannot answer anything. It is incomplete in that it offers no remediation path or statement of what the tool would do once the index exists, leaving the agent unable to plan around it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to convey; the baseline of 4 applies. The empty schema is consistent with the description.
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 never states what tibia_how_to_obtain actually does when operational; it only reports that the backing TibiaWiki index is missing. The agent must infer the function (explaining how an item/spell is acquired) entirely from the name, and there is no differentiation from siblings like tibia_find_items or tibia_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus the sibling lookups, nor any redirect to an alternative while the index is down. The only implicit message is 'do not call this,' which is a status notice rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tibia_searchCRead-only
UNAVAILABLE: the local TibiaWiki index is missing or unusable, so tibia_search cannot answer anything until it is built.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lower. The description adds a genuinely important operational fact not present in annotations: the tool is currently non-functional because the local index is missing. However, it reveals nothing about normal runtime behavior, result format, or limits once the index is available.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding, and the blocking condition is stated first. The all-caps 'UNAVAILABLE:' prefix reads like a raw error/template artifact rather than authored prose, which slightly undercuts the structure.
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 tool that is part of a five-member TibiaWiki family with no output schema and no parameters, the description should at minimum explain what a successful search returns and how it relates to the find_* and get siblings. Instead it only reports an outage, leaving an agent unable to route to or away from this tool on purpose grounds.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline rule a 4 applies. There is no parameter information the description could add or need to compensate for.
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 is a status/failure message rather than a purpose statement: it never says what tibia_search actually searches (TibiaWiki content? pages? entities?) when the index exists. An agent can infer only vaguely from the name that it is a search tool, and there is no differentiation from siblings like tibia_get or tibia_find_creatures beyond that.
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 does convey one implied directive — do not call this until the index is built — which is a usable precondition, but there is no guidance on when this tool is the right choice versus tibia_get or the tibia_find_* siblings, nor any general usage context.
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.
5 tool updates
v0.1.0- First observed
tibia_find_creatures - First observed
tibia_find_items - First observed
tibia_get - First observed
tibia_how_to_obtain - First observed
tibia_search
TDQS
Scored across 5 tools
Names suggest partially distinct purposes (direct lookup vs search vs creature/item finders vs obtain-method lookup), but tibia_get, tibia_search, and tibia_how_to_obtain plausibly overlap, and every description is an identical 'UNAVAILABLE' message that provides no differentiating guidance to an agent.
All five tools use a uniform 'tibia_' prefix followed by a clear snake_case verb/noun (get, search, find_creatures, find_items, how_to_obtain), with no style deviations.
Five tools is a lean but reasonable surface for a wiki lookup server; each covers a distinct lookup mode, though the set is a bit thin with no listing/browsing capability.
Core lookups (get, search, creatures, items, obtain-methods) are covered, but there is no way to list or browse categories, examine NPCs, quests, or locations, and all tools are currently non-functional pending index construction.
Related MCP Connectors
Wikipedia, Wikidata and Wiktionary as clean JSON, not HTML. 1.9M searchable. Free, no auth.
Search and fetch Wikidata entities, execute SPARQL queries, and resolve external identifiers.
Search 2b2t locations, groups, highways, renders, Archive warps, and WDL metadata.
Query Klaaro datasets, documents, and extracted records from any agent.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables completely offline Wikipedia search through locally-indexed content using BM25 algorithm, allowing AI assistants to query Wikipedia without internet connectivity or external API calls.-
- AlicenseAqualityAmaintenanceProvides fast, token-efficient search over coding agent documentation (e.g., Claude Code, Cursor) using local SQLite FTS5 indexing, with tools for searching snippets, reading pages, and grepping markdown.5MIT
- AlicenseBqualityBmaintenanceProvides read-only hybrid RAG search and discovery over a local-first AI knowledge corpus, enabling semantic and keyword search, browse, digest, and status tools.4PolyForm Noncommercial 1.0.0
- AlicenseAqualityBmaintenanceProvides read-only Arknights intelligence over MCP, enabling structured queries about stages, enemies, operators, and modules with region tagging and evidence-backed analysis. It uses versioned SQLite snapshots and never fetches upstream data at query time.13Apache 2.0