Skip to main content
Glama
birdwell

RuneScape Wiki MCP Server

RuneScape 3 MCP Server

npm npm downloads per month CI License: MIT Glama connector quality and endpoint health

Ask what it's worth, whether the flip clears tax, and what to train next.

Connect Claude, ChatGPT, Cursor, and other assistants to RuneScape 3 Grand Exchange guide prices, 7–90 day history, flip math after the 2% tax, public RS3 hiscores, and wiki pages. RS3 only. Unofficial, and not affiliated with Jagex or the RuneScape Wiki.

An independent Birdwell Labs project. No Jagex or Weird Gloop approval is claimed. Support and rights concerns · Permissions and source review.

Default prices are Jagex guide prices and Weirdgloop history. They lag the in-game market. Ask for reported instant-buy/sell prices to include the separate RS3 trade feed at prices.runescape.wiki.

Claude setup ChatGPT setup

Questions to ask

  • What's the guide price of a Noxious scythe, and how did it move over 30 days?

  • Compare a Noxious scythe, a Dragon rider lance, and an Abyssal whip.

  • Estimate the profit from flipping 100 Dragon rider lances after tax.

  • Look up my stats and tell me the weakest skill to train. Normal mode.

  • Find the RuneScape Wiki source link for the Abyssal whip special attack.

The server answers questions about items you name. It does not rank the whole Grand Exchange.

Price questions use lookup_item, get_item_details current-data views, get_price_series history views, and estimate_flip. Stats questions use get_player_stats on the selected normal, ironman or hardcore board; the assistant turns those levels into a training suggestion. Wiki questions use search_wiki, then get_wiki_page_content.

Wiki pages return source links by default. Article text is available only for reviewed revisions; the server does not supply an article summary when text is withheld.

Related MCP server: osrs-wikisync-mcp

Access and data handling

This server reads public APIs and performs calculations. It does not connect to the game client, control characters, place trades or ask for your Jagex password, session cookies or bank PIN. A player-name lookup sends the supplied name to Jagex's public hiscores endpoint.

Your assistant receives tool results and may use them to generate an answer. Its own privacy, retention and model-training settings apply separately; this project cannot promise how an AI provider handles those results. Check linked sources before acting on generated advice.

See the privacy policy before using the hosted service. Optional diagnostics may receive request context, and enabling DEBUG can print tool arguments and returned data. Do not submit secrets or information you do not want processed by the service and your AI provider.

Connect

Hosted endpoint: https://runescape-wiki-mcp.fly.dev/mcp

Privacy policy describes the tool-request data, diagnostics and service providers involved.

No server account, API key, game login or local installation is needed. Use Streamable HTTP with no authentication.

Claude setup

  1. Open Customize → Connectors, then + Add → Add custom connector.

  2. Name it RuneScape Wiki MCP and enter the hosted endpoint above.

  3. Choose No sign in when asked about authentication, then finish adding the connector.

  4. In a chat, enable it through + → Connectors and ask: “What is the RS3 guide price of an Abyssal whip?”

Team and Enterprise users may need an owner to add the connector first. See Claude's custom connector guide for your account's setup flow.

ChatGPT setup

  1. On ChatGPT web, open Plugins, select +, then Add custom MCP server.

  2. Name it RuneScape Wiki MCP, enter the hosted endpoint above, and select No authentication.

  3. Review the connection warning, then choose Create as a plugin.

  4. Install the resulting personal plugin. In a chat, type @, select it, and ask: “Compare Dragon bones and Frost dragon bones.”

Custom MCP access depends on your workspace permissions and security settings. See OpenAI's custom MCP guide if the option is unavailable.

Other MCP clients

For clients that accept remote MCP configuration, use:

{
  "mcpServers": {
    "runescape-wiki": {
      "url": "https://runescape-wiki-mcp.fly.dev/mcp"
    }
  }
}

For clients that require local stdio, install through npm:

{
  "mcpServers": {
    "runescape-wiki": {
      "command": "npx",
      "args": ["-y", "runescape-wiki-mcp"]
    }
  }
}

Local stdio, after bun install and bun run build:

{
  "mcpServers": {
    "runescape-wiki": {
      "command": "node",
      "args": ["/path/to/runescape-wiki-mcp/dist/index.js"]
    }
  }
}

Also listed on:

Speaks MCP 2026-07-28 (stateless) via stdio and Streamable HTTP, with legacy 2025-era clients still supported.

Tools

  • lookup_item — Resolve an item name to a Grand Exchange ID and the latest guide or Weirdgloop price. Start here when you only know the name.

  • get_item_details — Single/batch Jagex catalogue records and guide prices, with optional recorded-trade and numeric-fact enrichment.

  • get_price_series — Explicit observations/statistics views over historical prices; ID-based preferred discovery.

  • estimate_flip — Tax-adjusted flip profit, with optional remaining-quota and assumed-duration scenarios. Default prices lag the live market.

  • browse_items — Browse one Grand Exchange category by starting letter. This is not a name search.

  • get_ge_info — Catalogue metadata: default status, view: "categories" for IDs/names, or view: "category_counts" with category for letter counts.

  • get_player_stats — RS3 hiscores for a username. gameMode selects normal, ironman or hardcore. A 404 means the player was not found on that board; no other board is substituted.

  • search_wiki — Search RuneScape Wiki titles and source links when the page title is unknown.

  • get_wiki_page_content — Source reference following redirects; text only for a reviewed revision and matching content hash.

  • get_wiki_entity_facts — Structured monster combat statistics and quest metadata.

  • list_wiki_category_members — Direct Wiki category members with category-bound continuation.

  • get_wiki_drop_table — Indexed drop references, quantities, rolls and listed rarities; notes are excluded.

  • get_player_quests — Complete public RuneMetrics journal with quest statuses and Jagex eligibility; no Jev key needed.

  • recommend_next_activity — Opt-in paid goal-based planning using account context and Wiki evidence; requires the server configuration below.

Try the Jev recommendation tool locally

The MCP server owns the loop. The calling assistant supplies a goal and whatever account context it knows, then explains the structured result to the player. No separate agent framework or text-generation model is needed inside the server.

Set these in a local, ignored .env.local file. Do not commit the API key:

RUNESCAPE_RECOMMENDATIONS_ENABLED=true
TYPESAFE_API_KEY=your-typesafe-key
# Optional; defaults to jev-latest
TYPESAFE_MODEL=jev-latest
bun run build
node --env-file=.env.local dist/index.js
# Or use dist/http.js for a local HTTP MCP endpoint.

The entry point does not automatically load dotenv files. For an MCP client's stdio configuration, pass the same settings through its server env block or include --env-file=/absolute/path/to/.env.local in the Node arguments.

Example recommend_next_activity arguments:

{
  "goal": "Train Prayer toward bossing",
  "context": {
    "username": "YourName",
    "gameMode": "normal",
    "skills": { "Prayer": 50 },
    "budgetGp": 2000000,
    "sessionMinutes": 45,
    "playStyle": "active",
    "members": true,
    "completedQuests": ["The Restless Ghost"],
    "gear": [],
    "notes": "Prefer methods that help unlock future combat upgrades."
  }
}

Only goal is required. Public hiscores fill missing skill levels when a username is supplied; caller-supplied levels take precedence and their provenance is returned. Quest completion comes from RuneMetrics for quest goals; membership, gear and bank contents remain unknown unless provided. For other goals, a caller-supplied completed list records known completions only; absence does not mean a quest is unfinished.

For a quest question, supply the username and natural-language goal:

{
  "goal": "What is the best mining quest to do?",
  "context": { "username": "YourName" }
}

The server reads the fresh public RuneMetrics journal and the wiki pages for its quests, resolves title aliases and quest disambiguation, and reads the wiki's shared prerequisite table. Completed quests are excluded. Every unfinished quest is sent to Jev with completion rewards, separate conditional post-quest rewards, skill and quest prerequisites, current status, eligibility, and known blockers. Independent comparisons run in bounded batches, then a final comparison picks a quest to do now and useful blocked targets. The planner fetches the finalists' quick-guide checklists and returns their starting location, length, items, enemies, and opening walkthrough steps. Started quests retain their status; the exact stage must be read from the player's in-game journal.

Quest goals use at most 24 Jev requests, including routing, with two comparison requests in flight at once. Individual request bodies stay below 40,000 serialized characters. questCoverage reports journal totals, metadata coverage and the exact number of unfinished quests evaluated. Missing/private journals and missing wiki facts are reported explicitly. Skill/prerequisite checks and Jagex eligibility constrain the choices; current membership, inventory, combat readiness, boost alternatives and miscellaneous requirements may still need checking. A stale caller-supplied completion list does not override the fresh official journal. Public wiki quest metadata is cached for six hours; player journals are never cached.

For a skill training plan, use a goal such as "Train Mining to 70", or supply goalType: "skill_training", targetSkill: "Mining" and targetLevel: 70. The server reads wiki training tables and the fresh public quest completion set when a username is available, preserves separate rate assumptions such as buying energy versus gathering it, and compares methods available at each milestone. trainingPlan includes the next method, guide excerpts, source estimates, alternatives, and the remaining XP when it can be calculated. Missing XP uses an explicitly labeled level-floor upper bound. Invention's elite XP curve is not calculated with the standard formula. Plans cover up to six milestones and report any remaining range. Recommended level bands never become hard upper eligibility limits. Unsupported guide layouts remain explicit.

For unlock progression, use a goal such as "Help me unlock Invention", or supply goalType: "unlock_progression" and unlock: "Invention". The planner reads sourced requirements, walks unfinished prerequisite quests in order, and returns every known missing skill target. It selects one next action and fetches its training or quest guide. The initial catalogue covers Invention, targets in the wiki PvM unlock guide, and named quest rewards found in the account's quest catalogue. Broad comparisons cover the closest 16 targets; this is not a catalogue of every RuneScape unlock. Quest completion does not prove a reward was claimed or that additional challenges or ability levels are met.

Training goals use at most two Jev requests; unlock goals use at most three, including training selection. Set goalType: "activity" to use the original general activity search. Other activity goals make at most three Jev requests: route the goal, shortlist wiki search results, then assess goal relevance, eligibility, budget and session fit in one batch. The server performs up to two wiki searches, evaluates at most six candidates, and reads at most three pages. Page excerpts are capped at 6,000 characters. Routing and non-quest requests have a 55-second deadline. Full quest comparisons have a separate five-minute deadline after routing, to accommodate the bounded batches and catalogue reads. MCP clients should allow that longer timeout for quest requests. All paths have individual fetch timeouts and an aggregate 20,000-character serialized JSON limit on caller input, checked before paid calls. Excerpts are shortened further when needed to keep the complete Jev request within 40,000 serialized characters; returned sources reflect those excerpts. There are no automatic paid retries. Returned token counts let you measure actual usage; this prototype does not promise a particular dollar cost.

The result includes recommended, needs_context, no_match, or goal_met, a recommendation when supported, alternatives, wiki excerpts and links, missing context, warnings, per-dimension Jev answers and token usage. Suggestions are wiki activities or guides, not an exhaustive optimized progression plan. For general activity suggestions, requirements are model assessments over excerpts, not verified requirements; requirementsVerified is false. Quest suggestions report deterministic checks and their remaining limits through requirementChecks, blockers, and unknowns. Training and unlock plans return trainingCoverage and unlockCoverage; rates and profit figures are source estimates, not current-price or personal-performance predictions. It does not invent costs or durations. An assistant should communicate any conditions and ask for relevant missing facts.

Goals, supplied account context and retrieved evidence are sent to TypeSafe for evaluation. The recommendation module keeps account data and decisions only for the request. It caches general wiki extracts for five minutes, up to 64 pages, and public training/unlock guides for six hours, up to 16 pages. It does not cache goal searches or change the player's account. The other tools continue working when recommendations are disabled. Use locally or behind access control for the first trial; enabling this tool on a public server allows callers to consume the operator's paid Jev quota.

Prompts

  • check_item_price — itemName

  • compare_ge_items — items (comma-separated names)

  • estimate_item_flip — itemName, optional quantity

  • player_overview — username

Typical agent flow

lookup_item { query: "abyssal whip" }
  → id 4151, price …
get_item_details { itemId: 4151 }
get_price_series { itemId: 4151, view: "statistics", days: 30 }
search_wiki { query: "abyssal whip special attack" }

Optional history bounds use UTC calendar dates, for example get_price_series { "itemId": 4151, "from": "2026-10-01", "to": "2026-10-07" }. Bounds filter available samples; they do not extend Jagex history.

For flip scenarios, buyLimitRemaining is your remaining quota in the current window. The result separates quantity/profit within that quota from the full requested quantity. fillTimeMinutes is your assumed round-trip time for the full request, including any quota waits; it yields an assumed profit per hour. These inputs are assumptions, not observed limits or predicted fills.

Batch catalogue metadata with the get_item_details argument itemIds (GE IDs returned by lookup_item), or batch wiki references with get_wiki_page_content { "pages": ["Abyssal whip", "Grand Exchange"] }. Each accepts 1–10 entries, preserves order and returns per-row data or error, plus success/failure counts. At most two upstream requests run concurrently; a wholly failed batch is a tool error. An upstream 429 stops queued requests and preserves Retry-After guidance. Single-item/page calls keep their existing response shape. Wiki reviews apply separately to every page.

get_ge_info reports the catalogue configuration RuneDay, its derived UTC date and age, retrieval time and canonical category count. These describe catalogue configuration, not item-price freshness; priceFreshness is not_reported. RuneDate conversion uses the documented UTC epoch.

Resources

URI

Contents

runescape://ge/info

GE database info (not prices)

runescape://ge/categories

Canonical category list

Data sources

Guide prices come from Jagex. Daily history comes from Weirdgloop. Both lag the live high/low feed published at https://prices.runescape.wiki/api/v2/rs. This server does not call that feed.

  • Jagex GE: https://secure.runescape.com/m=itemdb_rs/api

  • Jagex hiscores lite: https://secure.runescape.com/m=hiscore/index_lite.ws

  • Weirdgloop RS exchange: https://api.weirdgloop.org/exchange/history/rs

  • RuneScape Wiki MediaWiki API: https://runescape.wiki/api.php

All requests send User-Agent:
RuneScape Wiki MCP Server - github.com/birdwell/runescape-wiki-mcp

Attribution and third-party content

Created using intellectual property belonging to Jagex Limited under the terms of Jagex's Fan Content Policy. This content is not endorsed by or affiliated with Jagex.

See Jagex's Fan Content Policy. These credits do not establish additional permissions or a partnership.

Price history and item lookup use the Weirdgloop API. Wiki text is by RuneScape Wiki contributors, generally licensed under CC BY-NC-SA 3.0, subject to content and revision-specific exceptions.

Wiki search returns titles and links without copying snippets. Unreviewed pages return links only, with contentStatus: "link_only", text: null and attribution.license: null. Both text and structured results carry source and contributor-history links. The server does not infer content permissions from a site's footer or namespace.

Extracts require a content-specific review in src/wikiContentPolicy.ts: exact title and revision, SHA-256 of the API's untrimmed plain-text extract, the actual license, copyright notices, reviewer, date and supporting review notes. No live pages are approved by default. Even approved pages fall back to links if the revision, namespace or content hash changes. Review the entire extract for imported or separately licensed material and preserve its notices. A digest verifies the reviewed bytes; it does not establish legal permission.

Noncommercial use and share-alike conditions apply where required by the reviewed license. Images and other media have their own terms. Preserve the attribution and applicable license when redistributing wiki content; downstream summaries and adaptations must also respect those terms.

The MIT license covers this project's original software, not third-party article text, game data, artwork or trademarks. Attribution alone does not settle the outstanding API, commercial-use or branding permission questions.

Game names identify the subject of the tool; they do not indicate sponsorship. Public API access, an npm package or a directory listing does not establish provider approval. Do not advertise this project as officially approved, ban-safe or authorized for every commercial or AI use. See the source review and outstanding permissions for the evidence and remaining questions.

Develop

  • Node.js 20+

  • bun

bun install
bun run build
bun run build:server-card # refresh local Smithery tool metadata after schema changes
bun run start          # stdio MCP server
bun run test           # unit + protocol compliance
bun run inspector      # MCP Inspector

Project layout

src/
├── index.ts          # stdio entry (serveStdio)
├── smithery.ts       # Smithery HTTP factory
├── server.ts         # createServer() + handlers
├── itemResolve.ts    # name → ID resolution
├── categories.ts     # GE category table
├── tools/            # MCP tools
└── resources.ts      # MCP resources

Notes

  • RS3 only, not OSRS (different IDs and endpoints).

  • Guide prices and Weirdgloop history lag the live market. Pass your own buy and sell prices to estimate_flip when you have them.

  • Normal, ironman and hardcore index_lite endpoints are supported. A player missing from the selected board returns a 404 tool error without falling back to another board.

  • Smithery hosts should rebuild the server card after tool changes so the published schema matches this README.

License

Original software: MIT. Third-party content retains its own licenses and rights; see Attribution and third-party content. Unofficial; not affiliated with Jagex or the RuneScape Wiki.

Raw history: get_price_series defaults to Jagex daily/average maps. Set source: "weirdgloop" for chronological daily samples with Unix-millisecond timestamps, prices and available volume. Inclusive UTC from/to bounds apply to either provider. Use view: "statistics" for computed statistics.

Wiki search defaults to articles. Query prefixes such as prefix:Category:Weapons select other Wiki namespaces. Search returns references only; page text remains subject to the existing exact revision/content review policy.

Catalogue records include item.wikiUrl, an official Wiki item-ID lookup link that redirects to the article. This does not fetch or reproduce article text.

Reported trades and numeric item facts

get_item_details { "itemId": 4151, "includeLiveData": true } adds item.liveTrades (last reported instant-buy/high and instant-sell/low transactions) and item.wikiFacts (published buy-limit cap, alchemy values and base value). The flag also works with itemIds batches. Default Jagex guide-price fields stay unchanged.

This uses the RS3 API v2, not the OSRS API or the obsolete RS3 v1 path. Trade timestamps are Unix seconds. Missing sides remain null; recorded trades are not an order book or guaranteed executable offers. A published buy limit does not reveal a player's remaining quota.

Public trade snapshots cache for 30 seconds and the shared numeric mapping for 10 minutes per server process, with concurrent requests coalesced and at most 512 cached item snapshots. fetchedAt records the original retrieval time on cache hits. Only numeric mapping facts are exposed; mapping examine text, names and media are discarded. Wiki article text still requires the existing per-revision/content review.

Structured monster and quest facts

get_wiki_entity_facts { "page": "Abyssal demon", "kind": "monster" } returns indexed numeric combat statistics. kind: "quest" returns quest IDs, membership, controlled difficulty/type labels and normalized release dates. Discover titles with search_wiki. Redirects resolve before querying; limit (1–10, default 5) caps variants, and truncated signals additional indexed rows. A mismatched page/kind is an error. Entity IDs are not GE item IDs.

This tool queries fixed, bounded datasets with title values kept inside data literals. It never fetches article prose, images or narrative summaries. Returned references identify the page/variant; attribution links identify the source without inferring an article-content license. The existing exact revision/hash policy still governs get_wiki_page_content text.

Discovery names and legacy calls

Discovery groups current records and candidate comparisons under get_item_details, and dated observations and statistics under get_price_series. Existing calls to get_item_price, get_item_graph, compare_item_prices, compare_items and summarize_price_history remain accepted with the same arguments and results. Aliases are not duplicated in the 14-tool discovery list.

Clients or gateways with tool-name allowlists may need the new discovery names enabled. The connector ID and hosted endpoint remain the same. No legacy call name is removed.

Wiki categories and indexed drops

list_wiki_category_members { "category": "Category:Weapons", "limit": 20 } returns direct member titles/IDs/namespace links. Pass its opaque nextCursor with the same category to continue. This does not recursively expand subcategories or fetch article bodies/images. Empty/missing categories can both return an empty set; concurrent Wiki edits can move page boundaries.

get_wiki_drop_table { "page": "Abyssal demon", "limit": 20 } returns indexed item references, quantity bounds, rolls and listed probabilities or controlled rarity labels. Unknown facts remain null. Use nextOffset to continue; optional variant must be an exact sourceReference from that article. Item references are not GE IDs: resolve them with lookup_item.

Drop facts come from the RS3 dropsline structured index. Editorial notes and alternative-rate annotations are discarded; hasOmittedAnnotations flags their presence. Listed probabilities describe individual rows, not an unconditional combined loot model. Follow sourceUrl for conditions, nested tables and source context. The exact revision/hash review gate for article text remains unchanged.

Catalogue metadata views

get_ge_info {} preserves the original configuration-status response. Use { "view": "categories" } to list GE IDs/names, or { "view": "category_counts", "category": 24 } to choose nonempty starting letters before browse_items. Category IDs identify groups, not items; their entry counts are not available stock. These views each return their corresponding existing result shape.

Legacy get_all_categories {} and get_category_info { "category": 24 } calls remain accepted with unchanged results, alongside the pricing compatibility calls. The two catalogue helpers are no longer duplicated in discovery. All existing call names remain supported; the published surface has 14 tools.

Wiki attribute discovery uses existing classification queries, e.g. search_wiki { "query": "incategory:\"Novice quests\"" }. To traverse a category subtree, call list_wiki_category_members again on returned namespace-14 member titles; keep each category's cursor separate.

Explicit history views and preferred ID inputs

Fresh discovery uses lookup_item as the name-resolution step. Pass its chosen GE ID to records, history, comparison and flip tools. Legacy name selectors—including compare_items/compare_item_prices name arrays—remain accepted by the server with unchanged results, but are not duplicated in the preferred schemas.

get_price_series { "itemId": 4151 } preserves the original observation response. view: "observations" supports Jagex (default) or Weirdgloop plus UTC from/to bounds. view: "statistics" uses Weirdgloop and optional days (default 30 trailing usable samples); it rejects Jagex and calendar-date bounds. Use one mode per call. The legacy summarize_price_history call remains accepted and returns exactly the same result as the statistics view.

Strict gateways or clients validating against fresh discovery must use the preferred ID-based schemas and history views. Compatibility names/selectors remain callable on the server for older clients; this does not bypass a gateway's own schema or allowlist policy.

Current-data views

get_item_details { "itemId": 4151 } preserves the original catalogue-record response. Use view: "records" for single/batch Jagex records and optional recorded-trade enrichment. Use { "view": "comparison", "itemIds": [4151,536] } for compact Weirdgloop daily snapshots; this view rejects itemId and live enrichment. Legacy compare_item_prices and compare_items calls remain accepted with unchanged results, including their older name-array selectors. They are no longer duplicated in the 14-tool discovery list.

Protected planner beta

The account-aware planner can run as an invite-only beta with authentication and persistent Jev spending limits. See beta setup and limits.

Available Tools

13 tools
browse_itemsBrowse Catalogue ItemsA
Read-onlyIdempotent
Inspect

Browse the Grand Exchange catalogue by category and starting letter. This is NOT a name search — use lookup_item for that. Use # for numeric names.

NameRequiredDescriptionDefault
pageNoPage number (starting from 1)
alphaNoStarting letter (a-z) or # for numbers. Defaults to "a".
categoryYesCategory ID (0-43)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered structurally. The description adds little behaviorally beyond the '#' convention for numeric names (which the schema also states); it says nothing about result ordering, page size, or what happens past the last page.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: the core action first, the exclusion next, the edge-case convention last. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only browse tool with full schema coverage and no output schema, the description covers purpose, disambiguation and the numeric-name edge case. The only real gap is how category IDs map to values, which a sibling tool covers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (category, alpha, page) are already documented with ranges and defaults. The description only restates the category/letter axes and the '#' rule, adding no semantics beyond the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Browse the Grand Exchange catalogue') plus the two axes it operates on (category and starting letter). It explicitly contrasts itself with lookup_item, so an agent can route between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says what this is NOT ('NOT a name search') and names the alternative tool for that case, which is strong routing guidance. It lacks guidance on pagination or on where to obtain valid category IDs, which the sibling get_all_categories presumably provides.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_itemsCompare ItemsA
Read-onlyIdempotent
Inspect

Compare latest Grand Exchange prices for up to 10 items in one call. Provide either names or itemIds. Returns one row per entry with id, name, price, volume and timestamp; entries that cannot be resolved come back as error rows instead of failing the call.

NameRequiredDescriptionDefault
namesNoItem names to compare (1-10). Provide names or itemIds, not both.
itemIdsNoGrand Exchange item IDs to compare (1-10). Provide names or itemIds, not both.

Output Schema

NameRequiredDescription
rowsYes
comparedYesNumber of rows returned

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the description's real contribution is the failure semantics: unresolved entries return error rows rather than failing the whole call. That is genuinely useful context an agent cannot derive from the annotations 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no padding, with the batch scope and input contract front-loaded and the return-shape/failure behavior placed after. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return fields needn't be documented, yet the description still summarizes the row shape and resolution-failure behavior. Combined with annotations covering the read-only/idempotent profile, nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — the 1-10 bounds, uniqueness, and 'names or itemIds, not both' constraint are all already documented in the schema. The description only restates the either/or rule, adding no format, casing, or resolution-order detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compare latest Grand Exchange prices') plus a scope qualifier ('up to 10 items in one call') that distinguishes it from the single-item siblings like get_item_price and lookup_item. It never names a sibling explicitly, so the differentiation is inferable rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives the input contract ('Provide either names or itemIds') but no when-to-use/when-not guidance relative to get_item_price, lookup_item, or estimate_flip. The batch-comparison use case is implied by 'up to 10 items in one call' but never framed as the reason to pick this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estimate_flipEstimate Flip ProfitA
Read-onlyIdempotent
Inspect

Estimate Grand Exchange flip profit after the 2% RS3 sales tax for an item, by itemId or name. This is an ESTIMATE ONLY: guide prices lag the live market, buy limits and fill times are not modelled, and actual profit will differ. Pass buyPrice/sellPrice to model your own offers.

NameRequiredDescriptionDefault
nameNoItem name (provide itemId or name). Prefer lookup_item for fuzzy search.
itemIdNoGrand Exchange item ID (provide itemId or name)
buyPriceNoBuy price per item in coins. Defaults to the current market price.
quantityNoNumber of items to flip (default 1)
sellPriceNoSell price per item in coins. Defaults to the current market price.

Output Schema

NameRequiredDescription
itemIdYes
taxRateNo
buyPriceYesBuy price per item in coins
itemNameNo
quantityYes
totalTaxNo
marginPctNo
netProfitYes
sellPriceYesSell price per item in coins
taxPerUnitNo
assumptionsNo
grossProfitNo
netProfitPerUnitNo
breakEvenSellPriceNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses real behavioral limits: guide prices lag the live market, buy limits and fill times are unmodelled, and results will differ from actual profit. That is meaningful caveat context, though it says nothing about precision, time windows, or data freshness beyond the lag warning.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what the tool computes and immediately followed by the accuracy caveat and the key optional-parameter usage. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, annotations cover the safety profile, and the description supplies the estimate-only caveat that annotations cannot express. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the rationale for buyPrice/sellPrice ('to model your own offers') and restates the itemId-or-name selector, clarifying intent rather than just repeating types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb ('Estimate') plus the exact resource and domain ('Grand Exchange flip profit after the 2% RS3 sales tax'), and names both input modes (itemId or name). This is clearly separable from siblings like get_item_price or compare_items, which do not model flip profit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent how to use it ('Pass buyPrice/sellPrice to model your own offers') and implicitly when it applies versus plain price lookups. It lacks an explicit when-not statement (e.g. use get_item_price for raw prices), so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_all_categoriesAll CategoriesA
Read-onlyIdempotent
Inspect

List all RS3 Grand Exchange category IDs and names (0-43).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is fully covered. The description adds one piece of behavioral context the annotations don't: the result set is a fixed, bounded range (0-43). It does not mention ordering, output shape, or caching.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, and it includes the one detail (the 0-43 range) that is actually informative. Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only lookup with full annotation coverage, the description suffices: it says what is returned (IDs and names) and the extent of the enumeration. Only the relationship to category-consuming siblings is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the schema carries nothing to clarify; baseline 4 applies. The description correctly signals no filtering or input is expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (RS3 Grand Exchange category IDs and names) with the full scope of the result set (0-43). An agent can tell this is a static reference enumeration distinct from lookup_item or browse_items without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to call this versus get_category_info, browse_items, or other siblings. The agent must infer that this is the discovery/enumeration step preceding a category-scoped call, but the description never says so.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_category_infoCategory InfoA
Read-onlyIdempotent
Inspect

Get letter counts for a Grand Exchange category. Use get_all_categories for IDs.

NameRequiredDescriptionDefault
categoryYesCategory ID (0-43)

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered structurally. The description adds no behavioral context beyond that — no return shape, no mention of what a 'letter count' result contains. Adequate but not additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and immediately followed by the prerequisite pointer. No filler, no restatement of the tool name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, no-output-schema read tool with full annotation coverage, the description is minimally sufficient. The gap is that 'letter counts' is never unpacked, so an agent cannot anticipate the response content, though it can call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — the single 'category' parameter is documented with its valid range (0-43) and bound by minimum/maximum. The description contributes only the cross-reference to get_all_categories for obtaining valid IDs, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get letter counts for a Grand Exchange category'), which is enough to distinguish it from siblings like get_ge_info or lookup_item. However, 'letter counts' is an unusual, unexplained concept, leaving some ambiguity about what is actually returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to the sibling get_all_categories when it needs valid category IDs, which resolves the main pre-call prerequisite. It does not, however, say when this tool should be preferred over other Grand Exchange siblings for other purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ge_infoGrand Exchange InfoA
Read-onlyIdempotent
Inspect

Read Grand Exchange database metadata, including lastConfigUpdateRuneday. This is not item prices; use get_item_price or lookup_item for those. Takes no arguments. Public Jagex endpoint, no auth.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description usefully adds that it is a public Jagex endpoint requiring no auth and that it takes no arguments — context the annotations do not supply. It stops short of describing response shape, but with an output schema present that is not required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the resource, then the exclusion, then the invocation constraints. No filler; every sentence carries new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations carry the safety profile. The description covers purpose, sibling routing, argument count and auth requirements — everything needed to invoke this metadata endpoint correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. The description confirms 'Takes no arguments', which is consistent with the empty, additionalProperties:false schema and prevents an agent from inventing inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read Grand Exchange database metadata') and even names a concrete field ('lastConfigUpdateRuneday'). It explicitly distinguishes itself from the item-price tools, so an agent can tell it apart from get_item_price and lookup_item without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-not guidance ('This is not item prices') paired with named alternatives ('use get_item_price or lookup_item for those'). Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_item_graphGet Item Price GraphA
Read-onlyIdempotent
Inspect

Read the public Jagex Grand Exchange daily price series for one item, about the last 180 days. Pass exactly one of itemId or name. No auth and no side effects. Use summarize_price_history for min, max, and average instead of the raw series.

NameRequiredDescriptionDefault
nameNoItem name (provide itemId or name)
itemIdNoGrand Exchange item ID (provide itemId or name)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and open-world, so "no side effects" is largely redundant. The description does add value annotations do not carry: no authentication is required, and the returned series is a bounded ~180-day daily window. It stops short of noting rate limits or whether very old data is truncated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core purpose, then the constraint, then the alternative. Every sentence carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. Between the description (scope, auth, mutual-exclusivity, alternative routing) and the annotations (safety profile), an agent has everything required to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds the mutual-exclusivity rule ("Pass exactly one of itemId or name") that the schema's additionalProperties:false does not actually express. Neither parameter is declared required in the schema, so this constraint is genuinely additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Read ... daily price series for one item") plus the scope ("about the last 180 days"), which is far more precise than the bare title. It is readily distinguishable from siblings like get_item_price (current price) and summarize_price_history (aggregates).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent away from this tool when aggregates are wanted: "Use summarize_price_history for min, max, and average instead of the raw series." However, it does not clarify how it differs from the closer siblings get_item_price and lookup_item, so guidance is clear but incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_item_priceGet Item PriceA
Read-onlyIdempotent
Inspect

Get current Grand Exchange price, trends, and examine text for an item. Pass exactly one of itemId or name.

NameRequiredDescriptionDefault
nameNoItem name (provide itemId or name). Prefer lookup_item for fuzzy search.
itemIdNoGrand Exchange item ID (provide itemId or name)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered structurally. The description adds the content shape of the result (price, trends, examine text) but says nothing beyond annotations about rate limits, caching/freshness of the price data, or how open-world lookups behave on unknown items.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the action and the returned data front-loaded and the argument rule second. Nothing is restated from the title or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and annotations carry the safety semantics; what remains is adequately covered by the description plus schema. The only gap is the absence of guidance on which sibling to pick for graph/history/compare needs, which slightly limits routing confidence for a tool that sits among several similar price tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds a constraint the schema cannot express: mutual exclusivity ('exactly one of' itemId or name), since the schema has no oneOf and zero required parameters. The sibling routing hint (prefer lookup_item for fuzzy search) also lives in the param description and helps disambiguate the two selectors.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (Get) and resource (current Grand Exchange price for an item) and enumerates the returned data (price, trends, examine text), which is more precise than a tautology. It does not, however, distinguish itself from siblings such as get_item_graph, compare_items, or lookup_item, so an agent can't tell from the description alone when this is the right retrieval tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives one concrete usage constraint — 'Pass exactly one of itemId or name' — which is real invocation guidance. But it offers no when-to-use/when-not guidance relative to the surrounding item/price tools (lookup_item, get_item_graph, compare_items), leaving selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_player_statsGet Player StatsA
Read-onlyIdempotent
Inspect

Get RS3 hiscores for a player. Normal mode works via Jagex index_lite. Ironman/hardcore use documented Jagex endpoints that currently return HTTP 404; the tool reports that clearly instead of falling back to normal data.

NameRequiredDescriptionDefault
gameModeNoHiscores board (default: normal)normal
usernameYesPlayer username to lookup

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive), so the bar is lower; the description adds a genuinely useful failure mode beyond them — ironman/hardcore return HTTP 404 and the tool surfaces that rather than silently falling back to normal data. It does not disclose rate limits or response shape, but the silent-fallback warning is the key behavioral fact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the core purpose first, then the mode-specific caveat. No filler, and the most important constraint (broken modes) is not buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers the operational caveats an agent needs before calling. Nothing material is missing for a two-parameter read-only lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), and the description goes beyond the enum labels by explaining what each mode means operationally (index_lite vs. alternate endpoints). That is real added meaning for the gameMode parameter rather than a restatement of the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get RS3 hiscores for a player'), which is immediately distinguishable from the item/GE/wiki-oriented siblings. An agent knows exactly what domain this tool covers without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear conditional guidance per game mode: normal works, ironman/hardcore hit currently-broken endpoints. It stops short of naming an alternative tool or an explicit 'use this instead of X' rule, but the mode-level context is enough to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wiki_page_contentGet Wiki Page ContentA
Read-onlyIdempotent
Inspect

Fetch plain-text content of a RuneScape Wiki page. Follows redirects. Pass an exact title; call search_wiki first when the title is unknown.

NameRequiredDescriptionDefault
pageYesWiki page title (spaces allowed; redirects are followed)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description still adds real context beyond that: redirects are followed and the payload is plain text rather than rendered HTML, which matters for downstream parsing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, with the core action front-loaded and the routing advice last. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description supplies the key missing fact (plain-text return) and the redirect behavior. It could note truncation or size limits on large pages, but nothing essential is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single 'page' parameter already documents that spaces are allowed and redirects are followed. The description's 'pass an exact title' reinforces the requirement but adds little beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (fetch) and resource (plain-text content of a RuneScape Wiki page), and immediately distinguishes itself from search_wiki, the closest sibling. An agent can tell what it returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'call search_wiki first when the title is unknown.' This names both the alternative tool and the condition that selects it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_itemLookup ItemA
Read-onlyIdempotent
Inspect

Resolve an item name to Grand Exchange ID and latest price. Uses exact name match first, then wiki opensearch. Prefer this before get_item_price when you only know the name.

NameRequiredDescriptionDefault
limitNoMax matches to return (default 5)
queryYesItem name or partial name to search for

Output Schema

NameRequiredDescription
matchesYesMatching Grand Exchange items, best match first

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds search strategy beyond annotations: exact name match first, then wiki opensearch fallback. Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. It does not mention rate limits or failure modes, but provides useful beyond-schema behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero wasted words. The core action is front-loaded, followed immediately by the search strategy and routing guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool with rich annotations, full schema coverage, and an output schema, the description supplies the necessary purpose, search behavior, and sibling routing. No critical agent-facing context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both query and limit are already well documented in the schema. The description adds no parameter syntax, default, or constraint beyond what the schema provides. Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: resolve an item name to Grand Exchange ID and latest price. It explicitly distinguishes itself from get_item_price by routing name-only lookups here. An agent can identify the tool's purpose without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule: prefer this before get_item_price when you only know the name. This names an alternative and a condition, though it does not cover when-not cases or other siblings like browse_items. Clear context without full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_wikiSearch WikiA
Read-onlyIdempotent
Inspect

Search RuneScape Wiki titles and snippets. Read-only. Use when the page title is unknown, then pass a result title to get_wiki_page_content. For Grand Exchange prices, use lookup_item instead.

NameRequiredDescriptionDefault
limitNoMax pages to return (default 5)
queryYesWords to search for on the RuneScape Wiki

Output Schema

NameRequiredDescription
resultsYesMatching RuneScape Wiki pages, best match first

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the important two-step workflow context (results feed get_wiki_page_content) and scopes the search to titles and snippets rather than full content, which annotations cannot express. 'Read-only' lightly repeats the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and scope, then usage, then the router to the alternative. No sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description covers the selection decision, the follow-up call, and the sibling exclusion. Nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both query and limit documented inline, so the schema carries the parameter burden. The description adds no syntax, format, or matching-behavior detail beyond it. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (RuneScape Wiki titles and snippets), and distinguishes itself from siblings lookup_item and get_wiki_page_content by naming both. An agent can place it in the toolset without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('when the page title is unknown'), an explicit next step ('pass a result title to get_wiki_page_content'), and an explicit exclusion with alternative ('For Grand Exchange prices, use lookup_item instead'). This is a model routing sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_price_historySummarize Price HistoryA
Read-onlyIdempotent
Inspect

Summarize one item's recent Grand Exchange prices: min, max, average, change, and average daily volume. Pass exactly one of itemId or name, and optional days from 7 to 90 (default 30). Use get_item_graph for the full daily series.

NameRequiredDescriptionDefault
daysNoSize of the trailing window in days (7-90, default 30)
nameNoItem name (provide itemId or name)
itemIdNoGrand Exchange item ID (provide itemId or name)

Output Schema

NameRequiredDescription
nameNoName supplied by the caller, when given
itemIdYesGrand Exchange item ID
avgPriceYesAverage price in the window, in coins
maxPriceYesHighest price in the window, in coins
minPriceYesLowest price in the window, in coins
changeAbsYeslatestPrice minus oldestPriceInWindow
changePctYesPercent change across the window
windowDaysYesTrailing window actually summarized
latestPriceYesNewest price in the window, in coins
sampleCountYesDaily samples inside the window
avgDailyVolumeNoAverage daily volume, when the source provided it
oldestPriceInWindowYesOldest price in the window, in coins

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered without the description. The description adds the input rule that exactly one of itemId/name must be passed and the window bounds, but says nothing about pagination, rate limits, or data staleness that would go beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both front-loaded with the most important information: what is computed first, then the input constraint and the sibling escape hatch. No filler or redundant restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail need not be repeated, and the annotations carry the safety profile. Between the description's metric list, the one-of input rule, the window bounds, and the sibling pointer, an agent has everything needed to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 nonetheless adds value the schema leaves ambiguous: 'Pass exactly one of itemId or name' resolves whether both may be supplied (the schema only says 'provide itemId or name'), and it restates the days range/default for quick reference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (summarize) and resource (one item's recent Grand Exchange prices) and enumerates the computed metrics (min, max, average, change, average daily volume). It also names the sibling get_item_graph and the condition that distinguishes them (full daily series), so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives one explicit alternative and when to prefer it: 'Use get_item_graph for the full daily series.' That is real routing guidance, but it does not address the other plausible siblings (get_item_price, compare_items) or state when a summary is preferable to a raw lookup beyond the series-vs-summary contrast.

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.

  1. 9 tool updatesv1.2.1
    • Changedcompare_items1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "compared": {
        +      "description": "Number of rows returned",
        +      "type": "integer"
        +    },
        +    "rows": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "error": {
        +            "description": "Present when this row could not be resolved",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Grand Exchange item ID",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "price": {
        +            "description": "Latest price in coins",
        +            "type": "number"
        +          },
        +          "query": {
        +            "description": "Name or id that was requested",
        +            "type": "string"
        +          },
        +          "timestamp": {
        +            "type": "string"
        +          },
        +          "volume": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "query"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "compared",
        +    "rows"
        +  ],
        +  "type": "object"
        +}
    • Changedestimate_flip1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": true,
        +  "description": "Flip estimate after the RS3 2% seller tax. marginPct is null when the buy cost is 0.",
        +  "properties": {
        +    "assumptions": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "breakEvenSellPrice": {
        +      "type": "number"
        +    },
        +    "buyPrice": {
        +      "description": "Buy price per item in coins",
        +      "type": "number"
        +    },
        +    "grossProfit": {
        +      "type": "number"
        +    },
        +    "itemId": {
        +      "type": "integer"
        +    },
        +    "itemName": {
        +      "type": "string"
        +    },
        +    "marginPct": {
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "netProfit": {
        +      "type": "number"
        +    },
        +    "netProfitPerUnit": {
        +      "type": "number"
        +    },
        +    "quantity": {
        +      "type": "integer"
        +    },
        +    "sellPrice": {
        +      "description": "Sell price per item in coins",
        +      "type": "number"
        +    },
        +    "taxPerUnit": {
        +      "type": "number"
        +    },
        +    "taxRate": {
        +      "type": "number"
        +    },
        +    "totalTax": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "itemId",
        +    "quantity",
        +    "buyPrice",
        +    "sellPrice",
        +    "netProfit"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ge_info1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": true,
        +  "description": "Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\".",
        +  "type": "object"
        +}
    • Changedget_item_graph1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": true,
        +  "description": "Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\".",
        +  "type": "object"
        +}
    • Changedget_item_price1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": true,
        +  "description": "Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\".",
        +  "type": "object"
        +}
    • Changedget_player_stats1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "experience": {
        +        "description": "Skill experience",
        +        "type": "integer"
        +      },
        +      "level": {
        +        "description": "Skill level",
        +        "type": "integer"
        +      },
        +      "rank": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "const": "Unranked"
        +          }
        +        ],
        +        "description": "Hiscores rank, or the string Unranked"
        +      }
        +    },
        +    "required": [
        +      "rank",
        +      "level",
        +      "experience"
        +    ],
        +    "type": "object"
        +  },
        +  "description": "Map of RS3 skill name to hiscores row. Overall is included.",
        +  "type": "object"
        +}
    • Changedlookup_item1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "matches": {
        +      "description": "Matching Grand Exchange items, best match first",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "error": {
        +            "description": "Why this row could not be resolved",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Grand Exchange item ID",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "description": "Item name",
        +            "type": "string"
        +          },
        +          "price": {
        +            "description": "Latest price in coins, when known",
        +            "type": "number"
        +          },
        +          "timestamp": {
        +            "description": "ISO timestamp of the price sample",
        +            "type": "string"
        +          },
        +          "volume": {
        +            "description": "Latest trade volume, when known",
        +            "type": "number"
        +          },
        +          "wikiUrl": {
        +            "description": "RuneScape Wiki page URL",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "matches"
        +  ],
        +  "type": "object"
        +}
    • Addedsearch_wiki
    • Changedsummarize_price_history1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "avgDailyVolume": {
        +      "description": "Average daily volume, when the source provided it",
        +      "type": "number"
        +    },
        +    "avgPrice": {
        +      "description": "Average price in the window, in coins",
        +      "type": "number"
        +    },
        +    "changeAbs": {
        +      "description": "latestPrice minus oldestPriceInWindow",
        +      "type": "number"
        +    },
        +    "changePct": {
        +      "description": "Percent change across the window",
        +      "type": "number"
        +    },
        +    "itemId": {
        +      "description": "Grand Exchange item ID",
        +      "type": "integer"
        +    },
        +    "latestPrice": {
        +      "description": "Newest price in the window, in coins",
        +      "type": "number"
        +    },
        +    "maxPrice": {
        +      "description": "Highest price in the window, in coins",
        +      "type": "number"
        +    },
        +    "minPrice": {
        +      "description": "Lowest price in the window, in coins",
        +      "type": "number"
        +    },
        +    "name": {
        +      "description": "Name supplied by the caller, when given",
        +      "type": "string"
        +    },
        +    "oldestPriceInWindow": {
        +      "description": "Oldest price in the window, in coins",
        +      "type": "number"
        +    },
        +    "sampleCount": {
        +      "description": "Daily samples inside the window",
        +      "type": "integer"
        +    },
        +    "windowDays": {
        +      "description": "Trailing window actually summarized",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "itemId",
        +    "windowDays",
        +    "sampleCount",
        +    "latestPrice",
        +    "oldestPriceInWindow",
        +    "minPrice",
        +    "maxPrice",
        +    "avgPrice",
        +    "changeAbs",
        +    "changePct"
        +  ],
        +  "type": "object"
        +}
  2. 12 tool updatesv1.1.0
    • First observedbrowse_items
    • First observedcompare_items
    • First observedestimate_flip
    • First observedget_all_categories
    • First observedget_category_info
    • First observedget_ge_info
    • First observedget_item_graph
    • First observedget_item_price
    • First observedget_player_stats
    • First observedget_wiki_page_content
    • First observedlookup_item
    • First observedsummarize_price_history

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation4/5

Most tools target distinct resources or actions, and descriptions explicitly redirect to alternatives. However, lookup_item and get_item_price both resolve an item name/id and return a current price, and summarize_price_history vs get_item_graph both cover price history, creating minor overlap that an agent could misselect.

Naming Consistency5/5

All 13 tool names use consistent snake_case with a clear verb_noun pattern (browse_items, lookup_item, get_item_price, summarize_price_history, search_wiki, etc.). No mixed conventions or vague verb-only names.

Tool Count5/5

13 tools sit comfortably in the well-scoped 3–15 range and cover a broad domain (Grand Exchange data plus RuneScape Wiki content and hiscores) without obvious redundancy. Each tool appears to earn its place.

Completeness4/5

The surface covers GE catalogue browsing, name resolution, current/historical prices, comparison, flip estimation, metadata, categories, player hiscores, wiki search, and page fetching, which is strong lifecycle coverage. Minor gaps remain, such as item stats/detail endpoints or wiki category listing, but agents can work around them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Exposes Old School RuneScape account data (quests, skills, diaries, etc.) via WikiSync and official HiScores, allowing Claude to query player progress without manual copy-pasting.
    2
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with RuneScape 3 and OSRS ecosystems through tools for Grand Exchange prices, player stats, and server data.
    19 npm
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to search the OSRS Wiki, lookup Grand Exchange prices, and access synced player data (bank, skills, quests, etc.) via local RuneLite plugin files.
    13
    12 npm
    1
    BSD 2-Clause "Simplified"