Skip to main content
Glama

RuneScape Wiki MCP: GE Analytics & References

Server Details

Read-only RS3 GE guide prices/history, optional reported buy/sell trades, buy-limit/alchemy facts, flip math and public hiscores. Search Wiki sources, list category members, and read structured monster/quest/drop facts. Guide prices lag activity; trades are not executable offers. Wiki article text requires reviewed revisions; other pages return links. Streamable HTTP; no account or API key. Independent Birdwell Labs project, unaffiliated with Jagex or the RuneScape Wiki.

Ownership verified
Status
Healthy
Uptime
100.0% over 24 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
birdwell/runescape-wiki-mcp
GitHub Stars
2
Server Listing
RuneScape Wiki MCP Server
ChatGPT
–
Claude
–

TDQS

A4.7/5.0

Scored across 14 tools

Disambiguation4/5

Most tools have clearly distinct roles: lookup_item resolves names, get_item_details reads records, get_price_series reads history, estimate_flip computes profit. The riskiest overlaps are browse_items vs get_ge_info (view=categories/category_counts) vs list_wiki_category_members, which all deal with category-style listing, but the descriptions explicitly cross-reference and warn about GE numeric IDs vs Wiki Category titles. get_wiki_entity_facts vs get_wiki_page_content is also close but separated by structured facts vs reviewed prose.

Naming Consistency4/5

All names are snake_case with noun-phrase targets (get_item_details, get_price_series, get_player_stats, search_wiki, lookup_item), so nothing is jarring. The verb set is mixed (get_/browse_/list_/lookup_/search_/estimate_/recommend_) and browse_items vs list_wiki_category_members use different verbs for comparable listing operations, which is a minor inconsistency rather than a real problem.

Tool Count5/5

14 tools is well within the well-scoped range for a domain spanning GE data, price history, player data, and Wiki references. Each tool covers a distinct resource or operation (identity resolution, records, history, categories, prose, facts, drops, stats, quests, planning) with no filler.

Completeness4/5

Coverage is strong: name resolution, item records/batch comparison, historical series, profit estimation, category browsing, drop tables, entity facts, page content, player stats and quests, plus a planner. Gaps are minor — no dedicated bulk ranking/screening of the whole GE (explicitly out of scope for get_item_details) and no equipment/stat-comparison surface — but agents can work around these with search_wiki and batched get_item_details calls.

Available Tools

14 tools
browse_itemsBrowse Catalogue ItemsA
Read-onlyIdempotent
Inspect

List GE items within one numeric category. Use list_wiki_category_members for Wiki Category: titles, lookup_item for names, or get_item_details for individual records.

  • Discover IDs with get_ge_info view=categories and nonempty letters with view=category_counts. IDs 0 and 42 both say Miscellaneous but identify separate groups.

  • {"category":24,"alpha":"#","page":2} selects the second numeric-name page of high-level melee weapons. Pass literal #, not %23; the server encodes it.

  • Restart page at 1 when category or alpha changes. Stop on empty items; isError signals failure rather than completion.

  • Jagex total counts the category, not the letter. Guide prices lag activity.

  • Each call makes one uncached Jagex read without credentials. HTTP defaults to 60 requests/IP/minute; wait for Retry-After after 429.

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

Output Schema

NameRequiredDescription
itemsYes
totalNoJagex catalogue total

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, but the description adds substantial operational context beyond them. It discloses that each call is an uncached Jagex read requiring no credentials, that HTTP defaults to 60 requests/IP/minute, that callers should wait for Retry-After after a 429, and that totals count the category rather than the letter. It also clarifies error semantics and price-lag 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?

The description is front-loaded with the core purpose and sibling routing, then uses compact bullets for discovery, parameter examples, pagination, count semantics, and rate limits. Every bullet adds operational value, and there is no redundant restatement of the schema or annotations.

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?

The tool is an open-world, paginated, rate-limited read operation, and the description covers discovery, pagination, stop conditions, error signaling, count semantics, and rate limiting. Since an output schema exists, the description need not explain return values. Nothing an agent needs in order to call this tool correctly is missing.

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

Parameters5/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 meaningful semantics beyond the schema. It explains that category IDs 0 and 42 both display as Miscellaneous but identify separate groups, that alpha should be passed as literal # rather than %23 because the server encodes it, and that page restarts when category or alpha changes. These details prevent common misuse of the parameters.

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?

The first sentence states a specific verb and resource: list GE items within one numeric category. It immediately distinguishes the tool from siblings by naming list_wiki_category_members, lookup_item, and get_item_details and describing their different roles. An agent can identify this as the category-browsing tool without opening any 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?

The description gives explicit routing guidance to alternatives and explains how to discover category IDs and letter filters via get_ge_info. It also states pagination rules: restart page at 1 when category or alpha changes, and stop on empty items because isError signals failure rather than completion. These are concrete when-to-use and how-to-use instructions.

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

Calculate RS3 resale-profit scenarios after seller tax. ESTIMATE ONLY; never places an order. Use get_item_details for current records/comparisons or lookup_item to resolve names.

  • itemId=4151 means Abyssal whip, not a quantity. quantity scales total investment, tax and profit without changing per-unit margin.

  • Omitting both prices gives identical buy/sell prices, usually a tax loss. Supply itemId and both prices to calculate without network access.

  • Seller tax is 2% of each unit's sell price, rounded down. Bonds and sales at 50 coins or less are exempt.

  • With quantity=20 and buyLimitRemaining=5, quota profit covers five units while requested totals still cover twenty. fillTimeMinutes converts full-request profit into an hourly rate, including assumed quota waits. Both inputs are caller assumptions, not observed limits or fill predictions.

  • Sampled prices lag live offers. Reads are uncached and require no credentials. HTTP defaults to 60 requests/IP/minute; wait for Retry-After after 429.

NameRequiredDescriptionDefault
itemIdYesKnown GE item ID resolved with lookup_item
buyPriceNoBuy price per item in coins. Defaults to the latest Weirdgloop sample, then Jagex guide price.
quantityNoNumber of items to flip (default 1)
sellPriceNoSell price per item in coins. Defaults to the latest Weirdgloop sample, then Jagex guide price.
fillTimeMinutesNoCaller-assumed minutes to buy and resell the full requested quantity, including any quota waits
buyLimitRemainingNoCaller-supplied remaining purchase quota in the current buy-limit window; 0 means none available

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
executionScenarioNoPresent only for caller-supplied capacity or duration scenarios; not a market prediction
breakEvenSellPriceNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds substantial behavioral context beyond those annotations: it never places an order, seller tax is 2% rounded down with exemptions, sampled prices lag live offers, reads are uncached and require no credentials, and HTTP defaults to 60 requests/IP/minute with Retry-After handling after 429.

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?

The definition is front-loaded with purpose and safety, then uses compact bullets to cover tax rules, assumptions, quota handling, price freshness, and rate limits. Every bullet adds material information for correct invocation rather than repeating schema or annotations.

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. Annotations cover safety and read-only behavior, while the description fills in critical estimation assumptions, tax treatment, quota interpretation, fill-time assumptions, price staleness, and rate-limit behavior, making the definition complete for this calculation tool.

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

Parameters5/5

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

Schema description coverage is 100%, but the description adds meaningful semantics beyond the schema: itemId=4151 means Abyssal whip rather than quantity, quantity scales total investment/tax/profit without changing per-unit margin, and buyLimitRemaining plus quantity create two profit views. It also explains fillTimeMinutes converts full-request profit into an hourly rate using caller assumptions.

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?

The description states a specific verb and resource: 'Calculate RS3 resale-profit scenarios after seller tax.' It immediately clarifies the tool is 'ESTIMATE ONLY; never places an order' and routes name resolution to lookup_item and current record lookup to get_item_details, distinguishing it from siblings.

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?

The description explicitly names alternatives: use get_item_details for current records/comparisons and lookup_item to resolve item names. It also gives concrete usage conditions, such as supplying itemId and both prices for calculation without network access, and explains when omitting prices produces identical buy/sell prices.

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

get_ge_infoRead GE Catalogue MetadataA
Read-onlyIdempotent
Inspect

Read RS3 GE catalogue metadata. Do not use this for item prices: use get_item_details. For entries use browse_items; for Wiki categories use list_wiki_category_members.

  • view=status reports configuration date/age, not price freshness.

  • view=categories lists all 44 built-in IDs; duplicate names identify separate groups.

  • view=category_counts requires category 0-43, e.g. 24 for high-level melee weapons. Category 0 is one Miscellaneous group, not an all-groups sentinel. The response counts entries by starting letter (# means numbers), not stock or offers.

category is rejected outside category_counts; it cannot filter the full list. categories needs no network; other views make one uncached Jagex read. No credentials required. HTTP defaults to 60 requests/IP/minute; honor 429 Retry-After.

NameRequiredDescriptionDefault
viewNoMetadata view; omit for the original configuration status resultstatus
categoryNoCategory ID (0-43)

Output Schema

NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/openWorld annotations, it discloses that categories needs no network, the other views make exactly one uncached Jagex read, no credentials are required, and the HTTP quota is 60 requests/IP/minute with 429 Retry-After handling. It also preempts misreadings (status reports config age, not price freshness).

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?

Purpose and sibling routing are front-loaded in the first two sentences, then short bullets handle each view-specific pitfall. Dense, but every line is an actionable disambiguation with no restatement of the schema or annotations.

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 shapes need not be explained; annotations carry the safety profile; the description covers everything else an agent needs (network cost, auth, rate limits, per-view semantics, invalid-argument behavior). Nothing relevant is missing.

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

Parameters5/5

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

Schema coverage is 100% (baseline 3), but the description materially adds meaning the schema cannot: the 44-ID range, duplicate names meaning separate groups, category 0-43 with example 24 for high-level melee weapons, category 0 not being an all-groups sentinel, counts keyed by starting letter, and that category is rejected outside category_counts.

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?

Opens with a specific verb+resource ("Read RS3 GE catalogue metadata") and immediately names the three sibling tools it is NOT, so an agent can tell it apart from get_item_details, browse_items and list_wiki_category_members without opening any 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 exclusions with named alternatives ("Do not use this for item prices: use get_item_details. For entries use browse_items; for Wiki categories use list_wiki_category_members") plus per-view guidance on which view to pick. Both when-to-use and when-not-to-use are stated.

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

get_item_detailsRead Current Item DataA
Read-onlyIdempotent
Inspect

Read current RS3 catalogue records or compare candidate snapshots. Resolve names with lookup_item; use get_price_series for dated history and estimate_flip for profit calculations.

  • records reads Jagex identity, examine/type/membership, icon URLs and guide prices. itemId=4151 means Abyssal whip. Arrays always return results[] in caller order, including errors at failed IDs, even for one entry.

  • includeLiveData adds reported trades and numeric Wiki facts without replacing guide fields. Trades are not executable offers; buy limits are not remaining quota.

  • comparison reads compact Weirdgloop daily price/volume snapshots for itemIds in caller order. Missing metrics remain absent and unresolved IDs become error rows. It does not rank the whole GE.

  • Record batches retain successful rows and error if all fail. At most two reads run concurrently; 429 stops queued reads. Invalid selectors fail before fetching.

  • Guide/comparison reads are uncached and lag activity. Trades cache for 30 seconds and facts for 10 minutes; cache hits preserve fetchedAt. No credentials are required. HTTP defaults to 60 requests/IP/minute; wait for Retry-After after 429.

NameRequiredDescriptionDefault
viewNoDetailed Jagex records (original default) or compact Weirdgloop comparison snapshotsrecords
itemIdNoKnown GE item ID resolved with lookup_item
itemIdsNoGE IDs of the target candidates
includeLiveDataNoOptional trade/mapping enrichment for the records view

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations, the description discloses rich behavioral details: records contents, array ordering and error rows, includeLiveData enrichment semantics, non-executable trade offers, buy limits, batch failure behavior, concurrency limits, 429 handling, cache TTLs, and rate-limit defaults. This is far more than the annotations provide.

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?

The description is dense but appropriate for a complex tool with two views and many operational caveats. It is front-loaded with purpose and alternatives, then uses bullets to organize behavior by view with no obvious 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?

Given the tool's complexity, output schema, and rich annotations, the description is complete enough to call correctly. It covers selection between views, output ordering, error handling, caching, concurrency, authentication, and rate limits.

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

Parameters5/5

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

Schema coverage is 100%, but the description still adds meaningful semantics: itemId=4151 is an example, itemIds order is preserved, includeLiveData adds trades and facts without replacing guide fields, and invalid selectors fail before fetching. It goes beyond the schema descriptions.

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?

The description states a specific verb and resource: read RS3 catalogue records or compare candidate snapshots. It explicitly distinguishes the tool from lookup_item, get_price_series, and estimate_flip, so an agent can identify its role 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?

It names alternatives and their purposes: resolve names with lookup_item, use get_price_series for dated history, and estimate_flip for profit calculations. It also clarifies that comparison does not rank the whole GE, giving useful scope boundaries.

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

get_player_questsGet Player Quest JournalA
Read-onlyIdempotent
Inspect

Read a public RS3 character's complete RuneMetrics quest journal. Use recommend_next_activity for paid advice, get_player_stats for levels, or get_wiki_entity_facts with kind=quest for one quest's metadata.

  • username is the character's display name, not a Jagex login, account ID or quest name. No signed-in-player default exists; ask which character when unknown.

  • Send {"username":"A B"}, not {"username":"A%20B"}. The server trims outer whitespace and encodes the name once. The returned username echoes that input; no alias or canonical-identity lookup is performed.

  • No gameMode or quest/status selector applies. Filter the complete returned journal locally; there is no pagination. A quest's members flag does not establish current account membership.

  • Invalid names, private/unavailable or malformed journals return isError/text, not an empty journal or guessed progress.

  • Sends the display name to Jagex RuneMetrics for one fresh uncached read, with a 12-second default deadline and no automatic retry. No Jev, API key, login or game changes. HTTP shares 60 requests/IP/minute by default; honor Retry-After on 429.

NameRequiredDescriptionDefault
usernameYesExact RS3 player display name

Output Schema

NameRequiredDescription
countsYesCounts over the returned journal: completed + started + notStarted equals total.
questsYesComplete journal entries returned by RuneMetrics
sourceYesRuneMetrics journal request URL
usernameYesTrimmed input echoed back; not a separate canonical-identity lookup
fetchedAtYesUTC retrieval time for this uncached journal

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent/openWorld annotations: one fresh uncached read, 12-second default deadline, no automatic retry, no API key or login, 60 requests/IP/minute, honor Retry-After on 429, and explicit failure behavior (isError/text rather than an empty journal or guessed progress). No pagination and local filtering are also disclosed.

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

Conciseness4/5

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

Front-loaded purpose sentence followed by tight bullets grouped by concern (identity, encoding, selectors, errors, network behavior). Dense but nearly every line carries an operational fact; minor bloat in the closing 'no Jev, API key, login or game changes' line.

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?

Output schema exists, so return values need not be described; everything else an agent needs — identity semantics, encoding, absence of pagination/selectors, error modes, caching, timeout, rate limits — is covered.

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% and the single param is already documented as 'Exact RS3 player display name', so the baseline is 3. The description adds real meaning beyond the schema: it is not a Jagex login, account ID or quest name, there is no signed-in-player default, and the caller must send a raw space rather than a percent-encoded name because the server encodes once and echoes the input.

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?

Opens with a specific verb and resource: 'Read a public RS3 character's complete RuneMetrics quest journal.' The scope word 'complete' and the source 'RuneMetrics' immediately distinguish it from get_player_stats and get_wiki_entity_facts.

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 three siblings: recommend_next_activity for paid advice, get_player_stats for levels, get_wiki_entity_facts with kind=quest for single-quest metadata. This is the when-to-use-this-vs-alternatives pattern done properly.

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

Read an RS3 player's published hiscores ranks, levels and experience, including Overall. Use search_wiki for training guides rather than player data.

  • username is the literal in-game display name, including spaces; the server URL-encodes it. gameMode chooses a separate leaderboard, not a filter on normal stats. Omit it for normal mode.

  • Normal, ironman and hardcore boards are supported. A player absent from the selected board returns a 404 tool error; the tool never substitutes another board. Unranked skills use rank Unranked; unavailable level/XP becomes 0.

  • No login, account changes or local cache. HTTP shares a default 60 requests/IP/minute budget; honor Retry-After on 429.

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

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations it discloses concrete operational traits: a 404 tool error when a player is absent from the selected board, no silent cross-board substitution, 'Unranked' rank and 0 for unavailable level/XP, no login/account changes/local cache, a 60 requests/IP/minute shared budget, and Retry-After handling on 429. This is exactly the context annotations cannot carry.

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?

The capability and the sibling routing are front-loaded in the first two sentences, then the remaining lines are grouped by concern (parameters, board semantics/errors, auth and rate limits). No sentence is filler, and the dense bullets are scannable rather than rambling.

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 only two parameters, an output schema already documenting return values, and annotations covering safety, the description adds the missing edges: failure mode, sentinel values, board isolation, and rate-limit behavior. Nothing an agent needs to call this correctly is absent.

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

Parameters5/5

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

Schema coverage is already 100% (baseline 3), and the description still adds real meaning: username is the literal in-game display name including spaces with server-side URL-encoding, and gameMode selects a separate leaderboard rather than filtering normal stats. Both clarifications prevent plausible misuse that the terse schema descriptions do not.

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?

The first sentence names a specific verb and resource ('Read an RS3 player's published hiscores ranks, levels and experience, including Overall') and immediately distinguishes itself from the nearest sibling by deferring training guides to search_wiki. An agent can identify the tool's job without inspecting 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?

It explicitly routes the agent away from this tool ('Use search_wiki for training guides rather than player data') and gives a selection rule for the one optional parameter ('Omit it for normal mode'). When-to-use, when-not-to-use, and the alternative are all stated.

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

get_price_seriesRead Item Price HistoryA
Read-onlyIdempotent
Inspect

Read dated RS3 price history for one known GE item. Resolve names with lookup_item; use get_item_details for current records or candidate comparisons.

  • itemId=4151 means Abyssal whip, not a quantity. For observations, choose Jagex for provider averages over roughly 180 days or Weirdgloop for daily samples with reported volume over roughly 90 days.

  • from/to include whole UTC days. Equal bounds cover that day; omitted bounds retain all available history. Requested dates cannot extend retention.

  • statistics computes min/max, unweighted mean and start-to-end change from a fixed 90-day Weirdgloop fetch. For example, days=7 takes the last seven usable samples even if missing dates make them span more than a week.

  • Each call returns its full retained series or statistics in one bounded response; there is no cursor or next page. Unavailable observation dates return empty data; unusable statistics history returns an error. Invalid bounds fail before fetching.

  • Reads are uncached and require no credentials. Provider errors surface without switching sources or retrying automatically. HTTP defaults to 60 requests/IP/minute; wait for Retry-After after 429.

NameRequiredDescriptionDefault
toNoLast UTC date to include; omitted means end of available history
daysNoSample window for the statistics view
fromNoFirst UTC date to include; omitted means start of available history
viewNoRaw observations (original default) or computed Weirdgloop statisticsobservations
itemIdYesKnown GE item ID resolved with lookup_item
sourceNoHistory data provider; allowed values and defaults depend on view

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only cover read-only/idempotent safety, but the description adds substantial context beyond them: uncached reads, no credentials required, no pagination (full series in one bounded response), empty data for unavailable observation dates vs error for unusable statistics history, invalid bounds failing before any fetch, no automatic provider fallback or retry, and a 60 req/IP/min limit with Retry-After on 429.

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

Conciseness4/5

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

Purpose and sibling routing are front-loaded, and bullets group view/provider, date semantics, statistics caveats, response shape, and rate limits into separate concerns. It is dense and long, but nearly every sentence carries operational information an agent cannot get from the schema or annotations.

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, yet the description still covers the response envelope (no cursor/next page), failure modes, and rate-limit behavior. For a 6-parameter tool with a oneOf constraint, all ambiguity an agent could hit is addressed.

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

Parameters5/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real semantic meaning: itemId is an ID not a quantity, days=7 means the last seven *usable samples* rather than a calendar span, from/to are whole UTC days with equal bounds covering that day, and requested dates cannot extend retention.

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 dated RS3 price history") and scopes it to "one known GE item," immediately separating it from lookup_item and get_item_details by name. An agent can route correctly 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 names two alternatives and the condition selecting each (lookup_item for name resolution, get_item_details for current records/candidates). It also gives per-view guidance on provider selection (Jagex ~180 days averages vs Weirdgloop ~90 days daily samples), so both the tool choice and the parameter choice are routed.

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

get_wiki_drop_tableGet Indexed Wiki Drop FactsA
Read-onlyIdempotent
Inspect

Read indexed RS3 drop items, quantities and listed rarities. Use get_wiki_entity_facts for combat stats or lookup_item for GE identities.

  • page resolves redirects; put #variant only in variant. A supplied variant must match a returned sourceReference; omission includes all variants.

  • offset counts source rows from zero, including malformed rows that are skipped. Follow nextOffset even after a short usable result. limit bounds rows, not kills/rolls; edits or tied names can shift boundaries.

  • Missing/non-article sources error; unindexed articles yield empty rows. Unknown facts stay null.

  • Listed probabilities are per row. Rolls and omitted conditions can change actual chances; consult the returned source link when hasOmittedAnnotations is true.

Each call reads article identity and the dropsline index without returning article prose/images. Uncached reads may lag and require no credentials. HTTP defaults to 60 requests/IP/minute; honor 429 Retry-After.

NameRequiredDescriptionDefault
pageYesLiteral source article title, e.g. Abyssal demon; not an item ID or URL
limitNoMaximum rows in this response
offsetNonextOffset from a prior result; omit to start
variantNoExact sourceReference for one variant of the resolved article

Output Schema

NameRequiredDescription
pageYes
rowsYes
fetchedAtYes
sourceUrlYes
nextOffsetYesContinue with this offset; null means the index page ended or the 10000 offset bound was reached
skippedRowsYes

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare the read-only, idempotent, open-world profile, yet the description adds substantial non-redundant behavior: redirect resolution, malformed rows counted in offset, nextOffset honored after short results, null facts, per-row probability caveats with hasOmittedAnnotations, and an explicit 60 req/IP/min limit with 429 Retry-After handling. This is well beyond what the annotations carry.

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?

Purpose and sibling routing are front-loaded, then a tight bulleted block covering pagination, errors, probabilities, and rate limits. Dense but every line carries operational consequence; 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?

For a 4-parameter paginated index reader with an output schema, the description covers the remaining gaps an agent needs: cross-call pagination discipline, failure modes, non-returned fields (no article prose/images), and throttling behavior.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds meaning the schema cannot express: page resolves redirects and '#variant' belongs only in variant, which must match a returned sourceReference, omission means all variants, offset counts skipped malformed rows, and limit bounds rows rather than kills/rolls.

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?

Opens with a specific verb and resource: 'Read indexed RS3 drop items, quantities and listed rarities.' It immediately distinguishes itself from the two most confusable siblings by naming them and their domains (combat stats vs GE identities).

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 away to get_wiki_entity_facts and lookup_item for adjacent needs, and states the conditions that yield errors or empty results ('Missing/non-article sources error; unindexed articles yield empty rows'), which tells the agent when this tool will not deliver.

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

get_wiki_entity_factsGet Structured Monster and Quest FactsA
Read-onlyIdempotent
Inspect

Read RS3 monster combat stats or quest metadata. Use search_wiki for titles, get_wiki_page_content for reviewed text/links, or get_item_details for GE records.

  • page is a literal main-article title with spaces; the server URL-encodes it. URLs, #variants, |separators and Category: titles are rejected.

  • kind chooses a dataset, not a name filter: quest includes miniquests, subquests and sagas; a title in the wrong dataset errors.

  • limit expands a prefix instead of advancing a page: raising 5 to 10 repeats the first five variants before adding more. Select variants by returned references. If truncated, increase limit or visit the source link; there is no cursor.

  • Missing fields are omitted instead of zero-filled. Article prose/images are excluded, and the uncached index can lag edits.

  • No credentials are required. HTTP defaults to 60 requests/IP/minute; wait for Retry-After after 429.

NameRequiredDescriptionDefault
kindYesStructured dataset: combat monster statistics or quest metadata
pageYesWiki page title, e.g. Abyssal demon or Cook's Assistant; redirects are resolved
limitNoMaximum variant records from the selected page (default 5)

Output Schema

NameRequiredDescription
kindYes
pageYesCanonical Wiki page title
recordsYes
fetchedAtYes
sourceUrlYes
truncatedYesAdditional indexed variants exceeded the requested limit
attributionYes

TDQS

A5/5.0
Behavior5/5

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

Annotations only declare read-only, idempotent, open-world safety. The description goes well beyond: rejected title forms (URLs, #variants, |, Category:), no-cursor truncation semantics, omitted-vs-zero-filled fields, exclusion of prose/images, index lag against edits, and concrete rate limits with Retry-After handling for 429s. This is substantially more than the annotations supply.

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?

Front-loaded purpose sentence, then bulleted constraints each carrying a distinct operational fact. Dense but zero filler; no sentence restates the title or schema.

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 shapes need not be described, and everything else an agent needs for correct invocation is present: dataset choice, title format, truncation strategy, missing-field behavior, auth, and throttling. Nothing material is left to guess.

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

Parameters5/5

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

Schema coverage is 100% so baseline is 3, but the description adds meaning the schema cannot: 'page' must be a literal title with spaces that the server URL-encodes, 'kind' selects a dataset rather than filtering (quest includes miniquests, subquests, sagas), and 'limit' expands a prefix rather than paginating, repeating earlier variants. These are non-obvious semantics that prevent real invocation mistakes.

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 RS3 monster combat stats or quest metadata') and immediately differentiates itself from three named siblings. An agent can tell this apart from search_wiki, get_wiki_page_content and get_item_details without opening any 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: use search_wiki for titles, get_wiki_page_content for reviewed text/links, get_item_details for GE records. It also states the failure condition ('a title in the wrong dataset errors') and what to do when truncated, which is exactly the when/when-not guidance that matters here.

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 Content or ReferencesA
Read-onlyIdempotent
Inspect

Get reviewed Wiki article text, or a source reference when text is unavailable. Use search_wiki for titles; get_item_details for prices.

  • page takes one unencoded title; pages takes 1-10, e.g. ["Abyssal whip"]. URLs, #fragments and |separators reject the call before fetching.

  • For page, read the flat response. For pages, even one title, check results[i].error before reading results[i].data. Rows preserve order and duplicates; redirects resolve.

  • The server sets output contentStatus: reviewed_extract includes approved, unchanged text and attribution; successful link_only has null text, url and reason. Inputs cannot approve content.

  • In valid batches, missing-page/API errors are per row; the call fails only if all rows fail. At most two requests run concurrently; 429 stops queued work.

  • No authentication is required and responses are not cached here. Shared HTTP budget: 60 requests/IP/minute. Honor Retry-After.

NameRequiredDescriptionDefault
pageNoWiki page title (spaces allowed; redirects are followed)
pagesNoWiki titles for a reference batch; exclusive with page

Output Schema

NameRequiredDescription
urlNo
textNo
titleNo
failedNo
reasonNo
resultsNo
succeededNo
revisionIdNo
attributionNo
contentStatusNo

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses per-row error handling, all-rows-fail behavior, concurrency limits, 429 queue stopping, no authentication, no caching, a shared HTTP budget of 60 requests/IP/minute, and Retry-After handling. These are exactly the operational traits an agent needs before invoking the tool.

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?

The description is front-loaded with purpose and routing guidance, then uses compact bullets for call-shape, response, error, and rate-limit details. Despite being information-dense, every bullet carries actionable information and none is merely restating the name.

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?

Given a two-parameter batch-capable tool with an output schema, the description is complete enough for correct invocation: it covers routing, parameter constraints, response shape, per-row errors, pagination-free ordering, redirects, auth, caching, and rate limits.

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

Parameters5/5

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

Schema coverage is 100%, but the description still adds meaningful semantics: page takes one unencoded title, pages accepts 1-10 titles, URLs, #fragments and | separators cause rejection before fetching, and redirects resolve. This goes beyond the schema and helps prevent malformed calls.

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?

The description states a specific verb and resource: get reviewed Wiki article text or a source reference when text is unavailable. It explicitly distinguishes this tool from search_wiki for titles and get_item_details for prices, so an agent can route correctly without opening sibling schemas.

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?

It gives explicit alternatives for adjacent tasks: use search_wiki for titles and get_item_details for prices. It also clarifies single-page versus batch usage through the page/pages distinction and the 1-10 title batch limit.

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

list_wiki_category_membersList Wiki Category MembersA
Read-onlyIdempotent
Inspect

List direct articles, subcategories and files in an RS3 Wiki category. Use search_wiki to discover category titles; get_ge_info (view=categories) lists GE groups instead.

category is a literal Category: title, not a GE number. limit bounds this page of members, not recursion depth. Supply nextCursor unchanged with the same category to continue. You may change limit between pages, but changing categories invalidates the cursor. There is no recursive expansion or snapshot lock, so edits can affect later pages.

An empty set can mean an empty or missing category. Results contain metadata links, never article bodies or images. Reads are uncached and need no credentials. HTTP defaults to 60 requests/IP/minute; honor 429 Retry-After.

NameRequiredDescriptionDefault
limitNoMaximum rows in this response
cursorNoOpaque nextCursor from this category; omit for its first page
categoryYesWiki category title including Category:, e.g. Category:Weapons

Output Schema

NameRequiredDescription
membersYes
categoryYes
fetchedAtYes
sourceUrlYes
nextCursorYes
skippedRowsYes
contentStatusYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses cursor semantics, that changing category invalidates the cursor, that there is no recursive expansion or snapshot lock, and that edits can affect later pages. It also states that reads are uncached, require no credentials, and are rate-limited at 60 requests/IP/minute with 429 Retry-After handling.

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?

The description is front-loaded with purpose, then moves through alternatives, parameter behavior, edge cases, and operational constraints. For a paginated, rate-limited tool with several subtle constraints, the length is justified and no sentence is wasted.

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?

The tool has an output schema, so return-value explanation is not required, but the description still clarifies that results contain metadata links rather than article bodies or images. Combined with pagination, error, and rate-limit guidance, it gives an agent enough context to call the tool correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds important meaning: `category` is a literal `Category:` title rather than a GE number, `limit` bounds only the current page rather than recursion depth, and `cursor` must be supplied unchanged for the same category while `limit` may change between pages. These details go beyond the schema descriptions and prevent common misuse.

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?

The first sentence states a specific verb and resource: list direct articles, subcategories, and files in an RS3 Wiki category. It also explicitly distinguishes the tool from `search_wiki` and `get_ge_info`, so an agent can tell what it does 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?

The description names the alternatives and the conditions that select them: use `search_wiki` to discover category titles, and `get_ge_info` with `view=categories` for GE groups instead. It also explains how to treat an empty result set, which is useful usage context.

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 tradeable RS3 names to GE IDs. Use search_wiki for quests, NPCs or guides; non-GE items cannot match here.

  • query="Abyssal whip" tries an exact match; "abyssal" discovers alternatives. An exact match ends the search regardless of limit.

  • limit also bounds Wiki candidates checked against Weirdgloop. Non-GE candidates are discarded, so results can be fewer; increasing limit widens that screening. Values outside 1–10 error before fetching rather than being clamped.

  • Pass a chosen ID to get_item_details for current records, get_price_series for history, or estimate_flip for profit math. No matches is a tool error; optional price/volume fields may be absent and samples lag activity.

  • Reads are uncached and need no credentials. HTTP defaults to 60 requests/IP/minute; wait for Retry-After after 429.

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

A5/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, openWorld, non-destructive), it discloses operational traits the schema cannot: reads are uncached and credential-free, HTTP quota is 60 requests/IP/minute with Retry-After backoff on 429, and out-of-range limits error before any fetch. It also warns that optional price/volume fields may be missing and that samples lag activity, so the agent won't misread an empty field as an error.

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 lead sentence plus four scannable bullets, ordered from search semantics to limit semantics to next steps to operational constraints. No sentence repeats the name, title, or schema text verbatim.

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 shape need not be spelled out, and the description still covers the edge cases that matter: no matches is a tool error, nullable price/volume fields, and data staleness. For a two-parameter read tool this leaves nothing an agent needs for correct invocation.

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

Parameters5/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 real meaning: an exact query ends the search regardless of limit, a partial query discovers alternatives, and limit bounds how many Wiki candidates get screened against Weirdgloop, so low limits can yield fewer results. It also clarifies that out-of-range values error rather than being clamped, which the schema alone doesn't say.

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?

"Resolve tradeable RS3 names to GE IDs" states a specific verb and resource plus the constraint that only GE-tradeable items match. It immediately distinguishes itself from the sibling search_wiki, which handles quests, NPCs and guides.

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?

It names the alternative (search_wiki) and the condition that selects it, and rules out non-GE items entirely. It also routes downstream: pass the chosen ID to get_item_details, get_price_series, or estimate_flip, giving the agent an explicit place in the workflow.

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

recommend_next_activityRecommend Next RS3 ActivityA
Read-onlyIdempotent
Inspect

Plan the next RS3 activity, training milestone or unlock prerequisite. Use get_player_quests for progress, get_player_stats for levels, get_wiki_entity_facts for one quest's facts, or search_wiki for references.

  • Routing: unlock overrides goalType, otherwise goalType overrides inference. targetSkill sets focus, not the planner.

  • Example: {"goal":"Train Mining","goalType":"skill_training","targetSkill":"Mining","targetLevel":70,"context":{"skills":{"Mining":52}}}. Without a target or goal-specified level, 52 defaults to 55.

  • Account: caller levels override hiscores; fresh journals override completion claims. Quest comparison needs a public context.username. Membership, gear and bank balances are not fetched.

  • Setup/privacy: operator RUNESCAPE_RECOMMENDATIONS_ENABLED=true and TYPESAFE_API_KEY. Goal/account context goes to TypeSafe; display-name lookups go to Jagex.

  • Cost: at most 24 paid Jev calls for quests, three otherwise, including routing. Repeated calls can incur fresh charges. No automatic paid retries; rounds completed before an error may already be billed.

  • Timing/errors: 55 seconds for routing/non-quest work, plus five minutes for quest comparison. Invalid input/configuration or fatal provider failures return isError/text. HTTP shares 60 requests/IP/minute by default; honor Retry-After on 429.

  • Freshness: public Wiki reads cache five minutes or six hours by planner. Player journals and decisions are not cached; no game account changes. General activity requires reviewed extracts; withheld text can yield no_match.

  • Outcomes: needs_context may still include a conditional recommendation; use missingContext to clarify it. no_match means no supported option; goal_met refers to the selected target. Communicate warnings and source conditions.

NameRequiredDescriptionDefault
goalYesDesired RS3 outcome in plain language, e.g. best Mining quest or train Mining to level 70; not instructions to execute arbitrary tools.
unlockNoNamed unlock such as Invention or Prifddinas. Providing it forces unlock_progression even when goalType says otherwise. Supported evidence covers Invention and bounded PvM/quest-reward targets, not every game unlock.
contextNoOptional known account facts; missing facts are not fabricated.
goalTypeNoactivity forces a general shortlist using reviewed Wiki extracts; quests compares unfinished journal quests; skill_training selects training milestones; unlock_progression builds unlock prerequisites. Omit to infer from goal. An unlock value overrides this selector.
targetLevelNoDestination level for skill_training only, not current level or XP. Precedence: this field, then an explicit level in goal, then the next multiple of five above the current level capped at 120. Other planners ignore this field.
targetSkillNoExact RS3 skill focus, overriding inferred focus for rewards or training. This does not select a planner; set goalType to force training or quest comparisons.

Output Schema

NameRequiredDescription
goalYesCaller goal after input normalization.
usageYesPaid Jev rounds, input/output token counts, model names and round budget.
statusYesOutcome: recommended proposes a candidate; needs_context requests facts; no_match has no supported option; goal_met means the target is already satisfied.
accountYesResolved account context with caller/public sources and unknown facts preserved.
sourcesYesEvidence references, retrieval/revision details and attribution where applicable.
warningsYesData gaps, coverage limits and conditions the caller should communicate.
unlockPlanNoNamed unlock and its prerequisite quest/skill progression, when applicable.
alternativesYesOther supported candidates; not an exhaustive catalogue.
trainingPlanNoTraining target, XP gap, methods and prerequisites when the training planner ran.
questCoverageNoQuest journal/catalogue comparison coverage, when the quest planner ran.
questDecisionNoQuest selection evidence and eligibility reasoning.
missingContextYesAccount facts or target details still needed for a confident plan.
recommendationYesTop candidate or null; the planner-specific recommendation is supported by sources and may remain conditional.
unlockCoverageNoUnlock evidence coverage and unresolved requirements.
trainingCoverageNoTraining evidence coverage and its limitations.
blockedAlternativesNoRejected or blocked candidates with their known conditions.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description adds substantial context beyond them: paid-call cost caps ("at most 24 paid Jev calls... three otherwise"), latency budgets (55s vs five minutes), rate limits with Retry-After handling, prerequisite env vars, and which data goes to TypeSafe vs Jagex. It also warns that already-completed rounds may be billed and that there are no automatic paid retries — exactly the behavioral disclosure a caller needs.

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

Conciseness4/5

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

The purpose and sibling-routing are front-loaded, and the bulleted sections (Routing, Account, Setup/privacy, Cost, Timing/errors, Freshness, Outcomes) are tight and scannable. It is long, but the density is warranted by a six-parameter, multi-mode planner with paid calls and privacy implications; little of it 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 not be described, yet the description still explains the outcome states (needs_context, no_match, goal_met) and how to act on them. Combined with setup prerequisites, billing, timing, caching and privacy notes, an agent has everything needed 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 a baseline 3 would be acceptable, but the description adds real value with a worked example that shows how goal, goalType, targetSkill, targetLevel and context interact, plus the defaulting behavior ("52 defaults to 55") and the routing override of unlock over goalType. These clarify cross-parameter precedence that is easy to misread in the schema alone.

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?

The opening sentence gives a specific verb ("Plan") and named outputs ("next RS3 activity, training milestone or unlock prerequisite"), and immediately distinguishes the tool from siblings by assigning progress/levels/quest-facts/reference lookups to get_player_quests, get_player_stats, get_wiki_entity_facts and search_wiki. An agent can tell this is a planner/composer, not a data fetcher, 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?

Explicit routing rules are given ("unlock overrides goalType, otherwise goalType overrides inference; targetSkill sets focus, not the planner"), a concrete example is supplied, and sibling tools are named with the condition that selects them. When-to-use and how-the-modes-interact are both spelled out rather than inferred.

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

search_wikiSearch Wiki PagesA
Read-onlyIdempotent
Inspect

Find RS3 Wiki sources for items, NPCs/monsters, quests and guides. Use get_wiki_page_content for reviewed text/page references, lookup_item for GE identities or get_item_details for catalogue records.

query accepts raw Wiki syntax; the server URL-encodes it. "Abyssal demon" "drop" requires both phrases; intitle:"Cook's Assistant" focuses titles. prefix:Category:Weapons selects Wiki categories instead of articles.

limit caps one relevance-ranked set, not an offset. No continuation cursor exists: refine the query for different matches. No matches returns an empty set; invalid queries or API failures return errors.

Public reads require no credentials and are uncached. The shared HTTP budget defaults to 60 requests/IP/minute; honor 429 Retry-After.

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

A5/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, yet the description still adds substantive behavior: no continuation cursor exists, limit caps one relevance-ranked set rather than acting as an offset, no matches yields an empty set while invalid queries return errors, reads are unauthenticated and uncached, and there is a 60 req/IP/min budget with 429 Retry-After. None of that is recoverable 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?

Four compact paragraphs ordered by importance: purpose and routing first, then query syntax, then result/limit semantics, then operational constraints. Every sentence carries distinct information; nothing restates the name or the annotations.

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?

Output schema exists, so return shape need not be described. The remaining agent-facing unknowns for a public search tool — pagination absence, empty-vs-error outcomes, auth, caching, and rate limits — are all covered.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline is 3, but the description earns more by explaining query syntax the schema omits ('Abyssal demon' 'drop' requires both phrases, intitle: for titles, prefix:Category: for categories) and server-side URL encoding, plus clarifying that limit is a relevance-ranked cap rather than an offset. This directly changes how an agent constructs calls.

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?

Opens with a specific verb and resource ('Find RS3 Wiki sources for items, NPCs/monsters, quests and guides') and immediately scopes the domain. It names the three sibling tools that cover adjacent needs, so an agent can distinguish search_wiki from get_wiki_page_content, lookup_item and get_item_details 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?

Explicitly routes: use get_wiki_page_content for reviewed text, lookup_item for GE identities, get_item_details for catalogue records. That names the alternatives and the condition that selects each, rather than leaving usage to inference.

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. 2 tool updates
    • Addedget_player_quests
    • Addedrecommend_next_activity
  2. 2 tool updates
    • Changedget_item_details3 fields changed
      • removedInput schema / examples
        Removed value: -[
        -  {
        -    "itemId": 4151
        -  },
        -  {
        -    "itemIds": [
        -      4151,
        -      536
        -    ]
        -  },
        -  {
        -    "includeLiveData": true,
        -    "itemId": 4151
        -  }
        -]
      • changedInput schema / properties / includeLiveData / description
        Previous value: -"Add RS3 API v2 last-reported trade high/low prices and numeric buy-limit/alchemy facts; preserves Jagex guide-price fields"New value: +"Optional trade/mapping enrichment for the records view"
      • changedInput schema / properties / itemIds / description
        Previous value: -"Known GE IDs for ordered record batches or comparison snapshots; exclusive with itemId"New value: +"GE IDs of the target candidates"
    • Changedget_price_series2 fields changed
      • changedInput schema / properties / days / description
        Previous value: -"Defaults to 30 trailing usable daily samples for statistics only; not a calendar-date range"New value: +"Sample window for the statistics view"
      • changedInput schema / properties / source / description
        Previous value: -"Observations: jagex by default or weirdgloop. Statistics: weirdgloop only, also the default for that view."New value: +"History data provider; allowed values and defaults depend on view"
  3. 5 tool updates
    • Removedcompare_item_prices
    • Changedestimate_flip4 fields changed
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "itemId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "name"
        -    ]
        -  }
        -]
      • changedInput schema / properties / itemId / description
        Previous value: -"Grand Exchange item ID (provide itemId or name)"New value: +"Known GE item ID resolved with lookup_item"
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Item name (provide itemId or name). Prefer lookup_item for fuzzy search.",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "itemId"
        +]
    • Changedget_item_details12 fields changed
      • changedInput schema / examples
        Previous value: -[
        -  {
        -    "itemId": 4151
        -  },
        -  {
        -    "name": "Abyssal whip"
        -  },
        -  {
        -    "itemIds": [
        -      4151,
        -      536
        -    ]
        -  },
        -  {
        -    "includeLiveData": true,
        -    "itemId": 4151
        -  }
        -]New value: +[
        +  {
        +    "itemId": 4151
        +  },
        +  {
        +    "itemIds": [
        +      4151,
        +      536
        +    ]
        +  },
        +  {
        +    "includeLiveData": true,
        +    "itemId": 4151
        +  }
        +]
      • changedInput schema / oneOf
        Previous value: -[
        -  {
        -    "required": [
        -      "itemId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "name"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "itemIds"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "oneOf": [
        +      {
        +        "required": [
        +          "itemId"
        +        ]
        +      },
        +      {
        +        "required": [
        +          "itemIds"
        +        ]
        +      }
        +    ],
        +    "properties": {
        +      "view": {
        +        "const": "records"
        +      }
        +    }
        +  },
        +  {
        +    "not": {
        +      "required": [
        +        "itemId"
        +      ]
        +    },
        +    "properties": {
        +      "includeLiveData": {
        +        "const": false
        +      },
        +      "view": {
        +        "const": "comparison"
        +      }
        +    },
        +    "required": [
        +      "view",
        +      "itemIds"
        +    ]
        +  }
        +]
      • changedInput schema / properties / itemId / description
        Previous value: -"Grand Exchange item ID (provide itemId or name)"New value: +"Known GE item ID resolved with lookup_item"
      • changedInput schema / properties / itemIds / description
        Previous value: -"Known GE IDs for a catalogue metadata batch; exclusive with itemId/name"New value: +"Known GE IDs for ordered record batches or comparison snapshots; exclusive with itemId"
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Item name (provide itemId or name). Prefer lookup_item for fuzzy search.",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • addedInput schema / properties / view
        Added value: +{
        +  "default": "records",
        +  "description": "Detailed Jagex records (original default) or compact Weirdgloop comparison snapshots",
        +  "enum": [
        +    "records",
        +    "comparison"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "$schema": "https://json-schema.org/draft/2020-12/schema",
        +    "additionalProperties": true,
        +    "oneOf": [
        +      {
        +        "required": [
        +          "item"
        +        ]
        +      },
        +      {
        +        "required": [
        +          "results",
        +          "succeeded",
        +          "failed"
        +        ]
        +      }
        +    ],
        +    "properties": {
        +      "failed": {
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "item": {
        +        "additionalProperties": true,
        +        "description": "Jagex catalogue item detail; prices are guide values, not executable offers",
        +        "properties": {
        +          "current": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "price": {
        +                "description": "Coins, possibly abbreviated with k or m",
        +                "type": [
        +                  "number",
        +                  "string"
        +                ]
        +              },
        +              "trend": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "day180": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "day30": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "day90": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "description": {
        +            "description": "In-game examine text",
        +            "type": "string"
        +          },
        +          "icon": {
        +            "description": "Small item icon URL",
        +            "type": "string"
        +          },
        +          "icon_large": {
        +            "description": "Large item icon URL",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Grand Exchange item ID",
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "liveTrades": {
        +            "additionalProperties": false,
        +            "description": "Opt-in RS3 recorded transactions; no order book or guaranteed fill price",
        +            "properties": {
        +              "fetchedAt": {
        +                "description": "Snapshot retrieval time; retained on cache hits",
        +                "format": "date-time",
        +                "type": "string"
        +              },
        +              "high": {
        +                "description": "Last reported instant-buy price in coins; may exceed 32-bit integers; null means none reported",
        +                "minimum": 0,
        +                "type": [
        +                  "number",
        +                  "null"
        +                ]
        +              },
        +              "highTime": {
        +                "description": "Instant-buy transaction Unix timestamp in seconds",
        +                "minimum": 0,
        +                "type": [
        +                  "integer",
        +                  "null"
        +                ]
        +              },
        +              "low": {
        +                "description": "Last reported instant-sell price in coins; null means none reported",
        +                "minimum": 0,
        +                "type": [
        +                  "number",
        +                  "null"
        +                ]
        +              },
        +              "lowTime": {
        +                "description": "Instant-sell transaction Unix timestamp in seconds",
        +                "minimum": 0,
        +                "type": [
        +                  "integer",
        +                  "null"
        +                ]
        +              },
        +              "sourceUrl": {
        +                "format": "uri",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "high",
        +              "highTime",
        +              "low",
        +              "lowTime",
        +              "sourceUrl",
        +              "fetchedAt"
        +            ],
        +            "type": "object"
        +          },
        +          "members": {
        +            "description": "Whether the item requires membership; Jagex returns a string",
        +            "enum": [
        +              "true",
        +              "false"
        +            ],
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "today": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": {
        +            "description": "Jagex catalogue category name",
        +            "type": "string"
        +          },
        +          "typeIcon": {
        +            "description": "Catalogue category icon URL",
        +            "type": "string"
        +          },
        +          "wikiFacts": {
        +            "additionalProperties": false,
        +            "description": "Opt-in numeric mapping fields; null when no usable mapping exists",
        +            "properties": {
        +              "buyLimit": {
        +                "description": "Published GE buy-limit cap, not remaining account quota",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "fetchedAt": {
        +                "description": "Mapping retrieval time; retained on cache hits",
        +                "format": "date-time",
        +                "type": "string"
        +              },
        +              "highAlchemy": {
        +                "description": "High alchemy value in coins",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "lowAlchemy": {
        +                "description": "Low alchemy value in coins",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "sourceUrl": {
        +                "format": "uri",
        +                "type": "string"
        +              },
        +              "value": {
        +                "description": "Base item value in coins",
        +                "minimum": 0,
        +                "type": "integer"
        +              }
        +            },
        +            "required": [
        +              "sourceUrl",
        +              "fetchedAt"
        +            ],
        +            "type": [
        +              "object",
        +              "null"
        +            ]
        +          },
        +          "wikiUrl": {
        +            "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search",
        +            "format": "uri",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "results": {
        +        "items": {
        +          "additionalProperties": false,
        +          "oneOf": [
        +            {
        +              "required": [
        +                "data"
        +              ]
        +            },
        +            {
        +              "required": [
        +                "error"
        +              ]
        +            }
        +          ],
        +          "properties": {
        +            "data": {
        +              "$schema": "https://json-schema.org/draft/2020-12/schema",
        +              "additionalProperties": true,
        +              "properties": {
        +                "item": {
        +                  "additionalProperties": true,
        +                  "description": "Jagex catalogue item detail; prices are guide values, not executable offers",
        +                  "properties": {
        +                    "current": {
        +                      "additionalProperties": true,
        +                      "properties": {
        +                        "price": {
        +                          "description": "Coins, possibly abbreviated with k or m",
        +                          "type": [
        +                            "number",
        +                            "string"
        +                          ]
        +                        },
        +                        "trend": {
        +                          "type": "string"
        +                        }
        +                      },
        +                      "type": "object"
        +                    },
        +                    "day180": {
        +                      "additionalProperties": true,
        +                      "type": "object"
        +                    },
        +                    "day30": {
        +                      "additionalProperties": true,
        +                      "type": "object"
        +                    },
        +                    "day90": {
        +                      "additionalProperties": true,
        +                      "type": "object"
        +                    },
        +                    "description": {
        +                      "description": "In-game examine text",
        +                      "type": "string"
        +                    },
        +                    "icon": {
        +                      "description": "Small item icon URL",
        +                      "type": "string"
        +                    },
        +                    "icon_large": {
        +                      "description": "Large item icon URL",
        +                      "type": "string"
        +                    },
        +                    "id": {
        +                      "description": "Grand Exchange item ID",
        +                      "minimum": 0,
        +                      "type": "integer"
        +                    },
        +                    "liveTrades": {
        +                      "additionalProperties": false,
        +                      "description": "Opt-in RS3 recorded transactions; no order book or guaranteed fill price",
        +                      "properties": {
        +                        "fetchedAt": {
        +                          "description": "Snapshot retrieval time; retained on cache hits",
        +                          "format": "date-time",
        +                          "type": "string"
        +                        },
        +                        "high": {
        +                          "description": "Last reported instant-buy price in coins; may exceed 32-bit integers; null means none reported",
        +                          "minimum": 0,
        +                          "type": [
        +                            "number",
        +                            "null"
        +                          ]
        +                        },
        +                        "highTime": {
        +                          "description": "Instant-buy transaction Unix timestamp in seconds",
        +                          "minimum": 0,
        +                          "type": [
        +                            "integer",
        +                            "null"
        +                          ]
        +                        },
        +                        "low": {
        +                          "description": "Last reported instant-sell price in coins; null means none reported",
        +                          "minimum": 0,
        +                          "type": [
        +                            "number",
        +                            "null"
        +                          ]
        +                        },
        +                        "lowTime": {
        +                          "description": "Instant-sell transaction Unix timestamp in seconds",
        +                          "minimum": 0,
        +                          "type": [
        +                            "integer",
        +                            "null"
        +                          ]
        +                        },
        +                        "sourceUrl": {
        +                          "format": "uri",
        +                          "type": "string"
        +                        }
        +                      },
        +                      "required": [
        +                        "high",
        +                        "highTime",
        +                        "low",
        +                        "lowTime",
        +                        "sourceUrl",
        +                        "fetchedAt"
        +                      ],
        +                      "type": "object"
        +                    },
        +                    "members": {
        +                      "description": "Whether the item requires membership; Jagex returns a string",
        +                      "enum": [
        +                        "true",
        +                        "false"
        +                      ],
        +                      "type": "string"
        +                    },
        +                    "name": {
        +                      "type": "string"
        +                    },
        +                    "today": {
        +                      "additionalProperties": true,
        +                      "type": "object"
        +                    },
        +                    "type": {
        +                      "description": "Jagex catalogue category name",
        +                      "type": "string"
        +                    },
        +                    "typeIcon": {
        +                      "description": "Catalogue category icon URL",
        +                      "type": "string"
        +                    },
        +                    "wikiFacts": {
        +                      "additionalProperties": false,
        +                      "description": "Opt-in numeric mapping fields; null when no usable mapping exists",
        +                      "properties": {
        +                        "buyLimit": {
        +                          "description": "Published GE buy-limit cap, not remaining account quota",
        +                          "minimum": 0,
        +                          "type": "integer"
        +                        },
        +                        "fetchedAt": {
        +                          "description": "Mapping retrieval time; retained on cache hits",
        +                          "format": "date-time",
        +                          "type": "string"
        +                        },
        +                        "highAlchemy": {
        +                          "description": "High alchemy value in coins",
        +                          "minimum": 0,
        +                          "type": "integer"
        +                        },
        +                        "lowAlchemy": {
        +                          "description": "Low alchemy value in coins",
        +                          "minimum": 0,
        +                          "type": "integer"
        +                        },
        +                        "sourceUrl": {
        +                          "format": "uri",
        +                          "type": "string"
        +                        },
        +                        "value": {
        +                          "description": "Base item value in coins",
        +                          "minimum": 0,
        +                          "type": "integer"
        +                        }
        +                      },
        +                      "required": [
        +                        "sourceUrl",
        +                        "fetchedAt"
        +                      ],
        +                      "type": [
        +                        "object",
        +                        "null"
        +                      ]
        +                    },
        +                    "wikiUrl": {
        +                      "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search",
        +                      "format": "uri",
        +                      "type": "string"
        +                    }
        +                  },
        +                  "type": "object"
        +                }
        +              },
        +              "required": [
        +                "item"
        +              ],
        +              "type": "object"
        +            },
        +            "error": {
        +              "type": "string"
        +            },
        +            "query": {
        +              "description": "Grand Exchange item ID",
        +              "minimum": 0,
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "query"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "succeeded": {
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  {
        +    "$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"
        +  }
        +]
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "item"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "results",
        -      "succeeded",
        -      "failed"
        -    ]
        -  }
        -]
      • removedOutput schema / properties
        Removed value: -{
        -  "failed": {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  "item": {
        -    "additionalProperties": true,
        -    "description": "Jagex catalogue item detail; prices are guide values, not executable offers",
        -    "properties": {
        -      "current": {
        -        "additionalProperties": true,
        -        "properties": {
        -          "price": {
        -            "description": "Coins, possibly abbreviated with k or m",
        -            "type": [
        -              "number",
        -              "string"
        -            ]
        -          },
        -          "trend": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "day180": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "day30": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "day90": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "description": {
        -        "description": "In-game examine text",
        -        "type": "string"
        -      },
        -      "icon": {
        -        "description": "Small item icon URL",
        -        "type": "string"
        -      },
        -      "icon_large": {
        -        "description": "Large item icon URL",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Grand Exchange item ID",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "liveTrades": {
        -        "additionalProperties": false,
        -        "description": "Opt-in RS3 recorded transactions; no order book or guaranteed fill price",
        -        "properties": {
        -          "fetchedAt": {
        -            "description": "Snapshot retrieval time; retained on cache hits",
        -            "format": "date-time",
        -            "type": "string"
        -          },
        -          "high": {
        -            "description": "Last reported instant-buy price in coins; may exceed 32-bit integers; null means none reported",
        -            "minimum": 0,
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "highTime": {
        -            "description": "Instant-buy transaction Unix timestamp in seconds",
        -            "minimum": 0,
        -            "type": [
        -              "integer",
        -              "null"
        -            ]
        -          },
        -          "low": {
        -            "description": "Last reported instant-sell price in coins; null means none reported",
        -            "minimum": 0,
        -            "type": [
        -              "number",
        -              "null"
        -            ]
        -          },
        -          "lowTime": {
        -            "description": "Instant-sell transaction Unix timestamp in seconds",
        -            "minimum": 0,
        -            "type": [
        -              "integer",
        -              "null"
        -            ]
        -          },
        -          "sourceUrl": {
        -            "format": "uri",
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "high",
        -          "highTime",
        -          "low",
        -          "lowTime",
        -          "sourceUrl",
        -          "fetchedAt"
        -        ],
        -        "type": "object"
        -      },
        -      "members": {
        -        "description": "Whether the item requires membership; Jagex returns a string",
        -        "enum": [
        -          "true",
        -          "false"
        -        ],
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "today": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "type": {
        -        "description": "Jagex catalogue category name",
        -        "type": "string"
        -      },
        -      "typeIcon": {
        -        "description": "Catalogue category icon URL",
        -        "type": "string"
        -      },
        -      "wikiFacts": {
        -        "additionalProperties": false,
        -        "description": "Opt-in numeric mapping fields; null when no usable mapping exists",
        -        "properties": {
        -          "buyLimit": {
        -            "description": "Published GE buy-limit cap, not remaining account quota",
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "fetchedAt": {
        -            "description": "Mapping retrieval time; retained on cache hits",
        -            "format": "date-time",
        -            "type": "string"
        -          },
        -          "highAlchemy": {
        -            "description": "High alchemy value in coins",
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "lowAlchemy": {
        -            "description": "Low alchemy value in coins",
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "sourceUrl": {
        -            "format": "uri",
        -            "type": "string"
        -          },
        -          "value": {
        -            "description": "Base item value in coins",
        -            "minimum": 0,
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "sourceUrl",
        -          "fetchedAt"
        -        ],
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "wikiUrl": {
        -        "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search",
        -        "format": "uri",
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  "results": {
        -    "items": {
        -      "additionalProperties": false,
        -      "oneOf": [
        -        {
        -          "required": [
        -            "data"
        -          ]
        -        },
        -        {
        -          "required": [
        -            "error"
        -          ]
        -        }
        -      ],
        -      "properties": {
        -        "data": {
        -          "$schema": "https://json-schema.org/draft/2020-12/schema",
        -          "additionalProperties": true,
        -          "properties": {
        -            "item": {
        -              "additionalProperties": true,
        -              "description": "Jagex catalogue item detail; prices are guide values, not executable offers",
        -              "properties": {
        -                "current": {
        -                  "additionalProperties": true,
        -                  "properties": {
        -                    "price": {
        -                      "description": "Coins, possibly abbreviated with k or m",
        -                      "type": [
        -                        "number",
        -                        "string"
        -                      ]
        -                    },
        -                    "trend": {
        -                      "type": "string"
        -                    }
        -                  },
        -                  "type": "object"
        -                },
        -                "day180": {
        -                  "additionalProperties": true,
        -                  "type": "object"
        -                },
        -                "day30": {
        -                  "additionalProperties": true,
        -                  "type": "object"
        -                },
        -                "day90": {
        -                  "additionalProperties": true,
        -                  "type": "object"
        -                },
        -                "description": {
        -                  "description": "In-game examine text",
        -                  "type": "string"
        -                },
        -                "icon": {
        -                  "description": "Small item icon URL",
        -                  "type": "string"
        -                },
        -                "icon_large": {
        -                  "description": "Large item icon URL",
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "description": "Grand Exchange item ID",
        -                  "minimum": 0,
        -                  "type": "integer"
        -                },
        -                "liveTrades": {
        -                  "additionalProperties": false,
        -                  "description": "Opt-in RS3 recorded transactions; no order book or guaranteed fill price",
        -                  "properties": {
        -                    "fetchedAt": {
        -                      "description": "Snapshot retrieval time; retained on cache hits",
        -                      "format": "date-time",
        -                      "type": "string"
        -                    },
        -                    "high": {
        -                      "description": "Last reported instant-buy price in coins; may exceed 32-bit integers; null means none reported",
        -                      "minimum": 0,
        -                      "type": [
        -                        "number",
        -                        "null"
        -                      ]
        -                    },
        -                    "highTime": {
        -                      "description": "Instant-buy transaction Unix timestamp in seconds",
        -                      "minimum": 0,
        -                      "type": [
        -                        "integer",
        -                        "null"
        -                      ]
        -                    },
        -                    "low": {
        -                      "description": "Last reported instant-sell price in coins; null means none reported",
        -                      "minimum": 0,
        -                      "type": [
        -                        "number",
        -                        "null"
        -                      ]
        -                    },
        -                    "lowTime": {
        -                      "description": "Instant-sell transaction Unix timestamp in seconds",
        -                      "minimum": 0,
        -                      "type": [
        -                        "integer",
        -                        "null"
        -                      ]
        -                    },
        -                    "sourceUrl": {
        -                      "format": "uri",
        -                      "type": "string"
        -                    }
        -                  },
        -                  "required": [
        -                    "high",
        -                    "highTime",
        -                    "low",
        -                    "lowTime",
        -                    "sourceUrl",
        -                    "fetchedAt"
        -                  ],
        -                  "type": "object"
        -                },
        -                "members": {
        -                  "description": "Whether the item requires membership; Jagex returns a string",
        -                  "enum": [
        -                    "true",
        -                    "false"
        -                  ],
        -                  "type": "string"
        -                },
        -                "name": {
        -                  "type": "string"
        -                },
        -                "today": {
        -                  "additionalProperties": true,
        -                  "type": "object"
        -                },
        -                "type": {
        -                  "description": "Jagex catalogue category name",
        -                  "type": "string"
        -                },
        -                "typeIcon": {
        -                  "description": "Catalogue category icon URL",
        -                  "type": "string"
        -                },
        -                "wikiFacts": {
        -                  "additionalProperties": false,
        -                  "description": "Opt-in numeric mapping fields; null when no usable mapping exists",
        -                  "properties": {
        -                    "buyLimit": {
        -                      "description": "Published GE buy-limit cap, not remaining account quota",
        -                      "minimum": 0,
        -                      "type": "integer"
        -                    },
        -                    "fetchedAt": {
        -                      "description": "Mapping retrieval time; retained on cache hits",
        -                      "format": "date-time",
        -                      "type": "string"
        -                    },
        -                    "highAlchemy": {
        -                      "description": "High alchemy value in coins",
        -                      "minimum": 0,
        -                      "type": "integer"
        -                    },
        -                    "lowAlchemy": {
        -                      "description": "Low alchemy value in coins",
        -                      "minimum": 0,
        -                      "type": "integer"
        -                    },
        -                    "sourceUrl": {
        -                      "format": "uri",
        -                      "type": "string"
        -                    },
        -                    "value": {
        -                      "description": "Base item value in coins",
        -                      "minimum": 0,
        -                      "type": "integer"
        -                    }
        -                  },
        -                  "required": [
        -                    "sourceUrl",
        -                    "fetchedAt"
        -                  ],
        -                  "type": [
        -                    "object",
        -                    "null"
        -                  ]
        -                },
        -                "wikiUrl": {
        -                  "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search",
        -                  "format": "uri",
        -                  "type": "string"
        -                }
        -              },
        -              "type": "object"
        -            }
        -          },
        -          "required": [
        -            "item"
        -          ],
        -          "type": "object"
        -        },
        -        "error": {
        -          "type": "string"
        -        },
        -        "query": {
        -          "description": "Grand Exchange item ID",
        -          "minimum": 0,
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "query"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "succeeded": {
        -    "minimum": 0,
        -    "type": "integer"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[]
    • Changedget_price_series14 fields changed
      • changedInput schema / oneOf
        Previous value: -[
        -  {
        -    "required": [
        -      "itemId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "name"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "days"
        +      ]
        +    },
        +    "properties": {
        +      "source": {
        +        "default": "jagex"
        +      },
        +      "view": {
        +        "const": "observations"
        +      }
        +    }
        +  },
        +  {
        +    "not": {
        +      "anyOf": [
        +        {
        +          "required": [
        +            "from"
        +          ]
        +        },
        +        {
        +          "required": [
        +            "to"
        +          ]
        +        }
        +      ]
        +    },
        +    "properties": {
        +      "days": {
        +        "default": 30
        +      },
        +      "source": {
        +        "const": "weirdgloop",
        +        "default": "weirdgloop"
        +      },
        +      "view": {
        +        "const": "statistics"
        +      }
        +    },
        +    "required": [
        +      "view"
        +    ]
        +  }
        +]
      • addedInput schema / properties / days
        Added value: +{
        +  "description": "Defaults to 30 trailing usable daily samples for statistics only; not a calendar-date range",
        +  "maximum": 90,
        +  "minimum": 7,
        +  "type": "integer"
        +}
      • changedInput schema / properties / itemId / description
        Previous value: -"Grand Exchange item ID (provide itemId or name)"New value: +"Known GE item ID resolved with lookup_item"
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Item name (provide itemId or name)",
        -  "minLength": 1,
        -  "type": "string"
        -}
      • removedInput schema / properties / source / default
        Removed value: -"jagex"
      • changedInput schema / properties / source / description
        Previous value: -"Provider/shape: Jagex daily+average maps (default), or raw Weirdgloop daily samples"New value: +"Observations: jagex by default or weirdgloop. Statistics: weirdgloop only, also the default for that view."
      • addedInput schema / properties / view
        Added value: +{
        +  "default": "observations",
        +  "description": "Raw observations (original default) or computed Weirdgloop statistics",
        +  "enum": [
        +    "observations",
        +    "statistics"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "itemId"
        +]
      • removedOutput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / additionalProperties
        Removed value: -true
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "$schema": "https://json-schema.org/draft/2020-12/schema",
        +    "additionalProperties": true,
        +    "oneOf": [
        +      {
        +        "required": [
        +          "daily",
        +          "average"
        +        ]
        +      },
        +      {
        +        "required": [
        +          "itemId",
        +          "source",
        +          "samples"
        +        ]
        +      }
        +    ],
        +    "properties": {
        +      "average": {
        +        "additionalProperties": {
        +          "type": "number"
        +        },
        +        "description": "Jagex averaged guide prices in coins, keyed by Unix timestamp in milliseconds",
        +        "type": "object"
        +      },
        +      "daily": {
        +        "additionalProperties": {
        +          "type": "number"
        +        },
        +        "description": "Daily guide prices in coins, keyed by Unix timestamp in milliseconds",
        +        "type": "object"
        +      },
        +      "itemId": {
        +        "description": "Grand Exchange item ID",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "samples": {
        +        "description": "Chronological usable observations; malformed timestamp/price rows are discarded, unreported volume omitted, and an entirely malformed nonempty feed is an error",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "price": {
        +              "description": "Observed guide price in coins",
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "timestamp": {
        +              "description": "UTC Unix timestamp in milliseconds, not seconds",
        +              "minimum": 0,
        +              "type": "integer"
        +            },
        +            "volume": {
        +              "description": "Provider-reported daily volume, when available",
        +              "minimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "timestamp",
        +            "price"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "source": {
        +        "const": "weirdgloop",
        +        "description": "Present for the Weirdgloop sample-array variant"
        +      }
        +    },
        +    "required": [],
        +    "type": "object"
        +  },
        +  {
        +    "$schema": "https://json-schema.org/draft/2020-12/schema",
        +    "additionalProperties": false,
        +    "properties": {
        +      "avgDailyVolume": {
        +        "description": "Unweighted mean of reported daily volumes, rounded to a whole number; unreported values are excluded",
        +        "type": "number"
        +      },
        +      "avgPrice": {
        +        "description": "Average price in the window, rounded to whole coins",
        +        "type": "number"
        +      },
        +      "changeAbs": {
        +        "description": "latestPrice minus oldestPriceInWindow",
        +        "type": "number"
        +      },
        +      "changePct": {
        +        "description": "Percent change across the window, rounded to two decimals; 0 when the oldest price is 0",
        +        "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"
        +  }
        +]
      • removedOutput schema / oneOf
        Removed value: -[
        -  {
        -    "required": [
        -      "daily",
        -      "average"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "itemId",
        -      "source",
        -      "samples"
        -    ]
        -  }
        -]
      • removedOutput schema / properties
        Removed value: -{
        -  "average": {
        -    "additionalProperties": {
        -      "type": "number"
        -    },
        -    "description": "Jagex averaged guide prices in coins, keyed by Unix timestamp in milliseconds",
        -    "type": "object"
        -  },
        -  "daily": {
        -    "additionalProperties": {
        -      "type": "number"
        -    },
        -    "description": "Daily guide prices in coins, keyed by Unix timestamp in milliseconds",
        -    "type": "object"
        -  },
        -  "itemId": {
        -    "description": "Grand Exchange item ID",
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  "samples": {
        -    "description": "Chronological usable observations; malformed timestamp/price rows are discarded, unreported volume omitted, and an entirely malformed nonempty feed is an error",
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "price": {
        -          "description": "Observed guide price in coins",
        -          "minimum": 0,
        -          "type": "number"
        -        },
        -        "timestamp": {
        -          "description": "UTC Unix timestamp in milliseconds, not seconds",
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "volume": {
        -          "description": "Provider-reported daily volume, when available",
        -          "minimum": 0,
        -          "type": "number"
        -        }
        -      },
        -      "required": [
        -        "timestamp",
        -        "price"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "source": {
        -    "const": "weirdgloop",
        -    "description": "Present for the Weirdgloop sample-array variant"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[]
    • Removedsummarize_price_history
  4. 4 tool updates
    • Removedget_all_categories
    • Removedget_category_info
    • Changedget_ge_info11 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "category"
        +      ]
        +    },
        +    "properties": {
        +      "view": {
        +        "enum": [
        +          "status",
        +          "categories"
        +        ]
        +      }
        +    }
        +  },
        +  {
        +    "properties": {
        +      "view": {
        +        "const": "category_counts"
        +      }
        +    },
        +    "required": [
        +      "view",
        +      "category"
        +    ]
        +  }
        +]
      • addedInput schema / properties
        Added value: +{
        +  "category": {
        +    "description": "Category ID (0-43)",
        +    "maximum": 43,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "view": {
        +    "default": "status",
        +    "description": "Metadata view; omit for the original configuration status result",
        +    "enum": [
        +      "status",
        +      "categories",
        +      "category_counts"
        +    ],
        +    "type": "string"
        +  }
        +}
      • removedOutput schema / additionalProperties
        Removed value: -true
      • removedOutput schema / properties / categoryCount
        Removed value: -{
        -  "description": "Number of canonical GE categories",
        -  "type": "integer"
        -}
      • removedOutput schema / properties / configurationAgeDays
        Removed value: -{
        -  "description": "UTC calendar days since configuration update; negative for a future upstream date",
        -  "type": "integer"
        -}
      • removedOutput schema / properties / fetchedAt
        Removed value: -{
        -  "description": "Server retrieval time, not a price update timestamp",
        -  "format": "date-time",
        -  "type": "string"
        -}
      • removedOutput schema / properties / lastConfigUpdateDate
        Removed value: -{
        -  "description": "Configuration UTC date derived from RuneDay",
        -  "format": "date",
        -  "type": "string"
        -}
      • removedOutput schema / properties / lastConfigUpdateRuneday
        Removed value: -{
        -  "description": "Upstream RuneDay counter for catalogue configuration update",
        -  "type": "integer"
        -}
      • removedOutput schema / properties / priceFreshness
        Removed value: -{
        -  "const": "not_reported",
        -  "description": "Configuration metadata does not report item-price freshness"
        -}
      • addedOutput schema / properties / result
        Added value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "anyOf": [
        +    {
        +      "$schema": "https://json-schema.org/draft/2020-12/schema",
        +      "additionalProperties": true,
        +      "properties": {
        +        "categoryCount": {
        +          "description": "Number of canonical GE categories",
        +          "type": "integer"
        +        },
        +        "configurationAgeDays": {
        +          "description": "UTC calendar days since configuration update; negative for a future upstream date",
        +          "type": "integer"
        +        },
        +        "fetchedAt": {
        +          "description": "Server retrieval time, not a price update timestamp",
        +          "format": "date-time",
        +          "type": "string"
        +        },
        +        "lastConfigUpdateDate": {
        +          "description": "Configuration UTC date derived from RuneDay",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "lastConfigUpdateRuneday": {
        +          "description": "Upstream RuneDay counter for catalogue configuration update",
        +          "type": "integer"
        +        },
        +        "priceFreshness": {
        +          "const": "not_reported",
        +          "description": "Configuration metadata does not report item-price freshness"
        +        }
        +      },
        +      "required": [
        +        "lastConfigUpdateRuneday",
        +        "lastConfigUpdateDate",
        +        "configurationAgeDays",
        +        "fetchedAt",
        +        "categoryCount",
        +        "priceFreshness"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "$schema": "https://json-schema.org/draft/2020-12/schema",
        +      "additionalProperties": false,
        +      "properties": {
        +        "categories": {
        +          "description": "All 44 category references, sorted by ID",
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "id": {
        +                "description": "Category ID (0-43)",
        +                "maximum": 43,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "name": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "name"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "categories"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "$schema": "https://json-schema.org/draft/2020-12/schema",
        +      "additionalProperties": true,
        +      "properties": {
        +        "alpha": {
        +          "items": {
        +            "properties": {
        +              "items": {
        +                "description": "Number of catalogue items in this letter group",
        +                "type": "integer"
        +              },
        +              "letter": {
        +                "description": "Starting letter, or # for numbers",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "letter",
        +              "items"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "types": {
        +          "items": {},
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "types",
        +        "alpha"
        +      ],
        +      "type": "object"
        +    }
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "lastConfigUpdateRuneday",
        -  "lastConfigUpdateDate",
        -  "configurationAgeDays",
        -  "fetchedAt",
        -  "categoryCount",
        -  "priceFreshness"
        -]New value: +[
        +  "result"
        +]
    • Changedsummarize_price_history1 field changed
      • changedOutput schema / properties / avgDailyVolume / description
        Previous value: -"Average daily volume rounded to a whole number, when the source provided it"New value: +"Unweighted mean of reported daily volumes, rounded to a whole number; unreported values are excluded"
  5. 2 tool updates
    • Addedget_wiki_drop_table
    • Addedlist_wiki_category_members
  6. 6 tool updates
    • Addedcompare_item_prices
    • Removedcompare_items
    • Addedget_item_details
    • Removedget_item_graph
    • Removedget_item_price
    • Addedget_price_series
  7. 2 tool updates
    • Changedget_item_price6 fields changed
      • changedInput schema / examples
        Previous value: -[
        -  {
        -    "itemId": 4151
        -  },
        -  {
        -    "name": "Abyssal whip"
        -  },
        -  {
        -    "itemIds": [
        -      4151,
        -      536
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "itemId": 4151
        +  },
        +  {
        +    "name": "Abyssal whip"
        +  },
        +  {
        +    "itemIds": [
        +      4151,
        +      536
        +    ]
        +  },
        +  {
        +    "includeLiveData": true,
        +    "itemId": 4151
        +  }
        +]
      • addedInput schema / properties / includeLiveData
        Added value: +{
        +  "default": false,
        +  "description": "Add RS3 API v2 last-reported trade high/low prices and numeric buy-limit/alchemy facts; preserves Jagex guide-price fields",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / item / properties / liveTrades
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Opt-in RS3 recorded transactions; no order book or guaranteed fill price",
        +  "properties": {
        +    "fetchedAt": {
        +      "description": "Snapshot retrieval time; retained on cache hits",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "high": {
        +      "description": "Last reported instant-buy price in coins; may exceed 32-bit integers; null means none reported",
        +      "minimum": 0,
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "highTime": {
        +      "description": "Instant-buy transaction Unix timestamp in seconds",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "low": {
        +      "description": "Last reported instant-sell price in coins; null means none reported",
        +      "minimum": 0,
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "lowTime": {
        +      "description": "Instant-sell transaction Unix timestamp in seconds",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "sourceUrl": {
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "high",
        +    "highTime",
        +    "low",
        +    "lowTime",
        +    "sourceUrl",
        +    "fetchedAt"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / item / properties / wikiFacts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Opt-in numeric mapping fields; null when no usable mapping exists",
        +  "properties": {
        +    "buyLimit": {
        +      "description": "Published GE buy-limit cap, not remaining account quota",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "fetchedAt": {
        +      "description": "Mapping retrieval time; retained on cache hits",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "highAlchemy": {
        +      "description": "High alchemy value in coins",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "lowAlchemy": {
        +      "description": "Low alchemy value in coins",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "sourceUrl": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "value": {
        +      "description": "Base item value in coins",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "sourceUrl",
        +    "fetchedAt"
        +  ],
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / results / items / properties / data / properties / item / properties / liveTrades
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Opt-in RS3 recorded transactions; no order book or guaranteed fill price",
        +  "properties": {
        +    "fetchedAt": {
        +      "description": "Snapshot retrieval time; retained on cache hits",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "high": {
        +      "description": "Last reported instant-buy price in coins; may exceed 32-bit integers; null means none reported",
        +      "minimum": 0,
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "highTime": {
        +      "description": "Instant-buy transaction Unix timestamp in seconds",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "low": {
        +      "description": "Last reported instant-sell price in coins; null means none reported",
        +      "minimum": 0,
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "lowTime": {
        +      "description": "Instant-sell transaction Unix timestamp in seconds",
        +      "minimum": 0,
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "sourceUrl": {
        +      "format": "uri",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "high",
        +    "highTime",
        +    "low",
        +    "lowTime",
        +    "sourceUrl",
        +    "fetchedAt"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / results / items / properties / data / properties / item / properties / wikiFacts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Opt-in numeric mapping fields; null when no usable mapping exists",
        +  "properties": {
        +    "buyLimit": {
        +      "description": "Published GE buy-limit cap, not remaining account quota",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "fetchedAt": {
        +      "description": "Mapping retrieval time; retained on cache hits",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "highAlchemy": {
        +      "description": "High alchemy value in coins",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "lowAlchemy": {
        +      "description": "Low alchemy value in coins",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "sourceUrl": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "value": {
        +      "description": "Base item value in coins",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "sourceUrl",
        +    "fetchedAt"
        +  ],
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Addedget_wiki_entity_facts
  8. 1 tool update
    • Changedget_item_price1 field changed
      • addedInput schema / examples
        Added value: +[
        +  {
        +    "itemId": 4151
        +  },
        +  {
        +    "name": "Abyssal whip"
        +  },
        +  {
        +    "itemIds": [
        +      4151,
        +      536
        +    ]
        +  }
        +]
  9. 2 tool updates
    • Changedget_item_graph6 fields changed
      • addedInput schema / properties / source
        Added value: +{
        +  "default": "jagex",
        +  "description": "Provider/shape: Jagex daily+average maps (default), or raw Weirdgloop daily samples",
        +  "enum": [
        +    "jagex",
        +    "weirdgloop"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "daily",
        +      "average"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "itemId",
        +      "source",
        +      "samples"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / itemId
        Added value: +{
        +  "description": "Grand Exchange item ID",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / samples
        Added value: +{
        +  "description": "Chronological usable observations; malformed timestamp/price rows are discarded, unreported volume omitted, and an entirely malformed nonempty feed is an error",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "price": {
        +        "description": "Observed guide price in coins",
        +        "minimum": 0,
        +        "type": "number"
        +      },
        +      "timestamp": {
        +        "description": "UTC Unix timestamp in milliseconds, not seconds",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "volume": {
        +        "description": "Provider-reported daily volume, when available",
        +        "minimum": 0,
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "timestamp",
        +      "price"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / source
        Added value: +{
        +  "const": "weirdgloop",
        +  "description": "Present for the Weirdgloop sample-array variant"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "daily",
        -  "average"
        -]New value: +[]
    • Changedget_item_price2 fields changed
      • addedOutput schema / properties / item / properties / wikiUrl
        Added value: +{
        +  "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search",
        +  "format": "uri",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / data / properties / item / properties / wikiUrl
        Added value: +{
        +  "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search",
        +  "format": "uri",
        +  "type": "string"
        +}
  10. 3 tool updates
    • Changedget_ge_info7 fields changed
      • addedOutput schema / properties / categoryCount
        Added value: +{
        +  "description": "Number of canonical GE categories",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / configurationAgeDays
        Added value: +{
        +  "description": "UTC calendar days since configuration update; negative for a future upstream date",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / fetchedAt
        Added value: +{
        +  "description": "Server retrieval time, not a price update timestamp",
        +  "format": "date-time",
        +  "type": "string"
        +}
      • addedOutput schema / properties / lastConfigUpdateDate
        Added value: +{
        +  "description": "Configuration UTC date derived from RuneDay",
        +  "format": "date",
        +  "type": "string"
        +}
      • changedOutput schema / properties / lastConfigUpdateRuneday / description
        Previous value: -"RuneScape day counter for catalogue configuration update"New value: +"Upstream RuneDay counter for catalogue configuration update"
      • addedOutput schema / properties / priceFreshness
        Added value: +{
        +  "const": "not_reported",
        +  "description": "Configuration metadata does not report item-price freshness"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "lastConfigUpdateRuneday"
        -]New value: +[
        +  "lastConfigUpdateRuneday",
        +  "lastConfigUpdateDate",
        +  "configurationAgeDays",
        +  "fetchedAt",
        +  "categoryCount",
        +  "priceFreshness"
        +]
    • Changedget_item_price7 fields changed
      • changedInput schema / oneOf
        Previous value: -[
        -  {
        -    "required": [
        -      "itemId"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "name"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "required": [
        +      "itemId"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "name"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "itemIds"
        +    ]
        +  }
        +]
      • addedInput schema / properties / itemIds
        Added value: +{
        +  "description": "Known GE IDs for a catalogue metadata batch; exclusive with itemId/name",
        +  "items": {
        +    "description": "Grand Exchange item ID",
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "maxItems": 10,
        +  "minItems": 1,
        +  "type": "array",
        +  "uniqueItems": true
        +}
      • addedOutput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "item"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "results",
        +      "succeeded",
        +      "failed"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / failed
        Added value: +{
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "oneOf": [
        +      {
        +        "required": [
        +          "data"
        +        ]
        +      },
        +      {
        +        "required": [
        +          "error"
        +        ]
        +      }
        +    ],
        +    "properties": {
        +      "data": {
        +        "$schema": "https://json-schema.org/draft/2020-12/schema",
        +        "additionalProperties": true,
        +        "properties": {
        +          "item": {
        +            "additionalProperties": true,
        +            "description": "Jagex catalogue item detail; prices are guide values, not executable offers",
        +            "properties": {
        +              "current": {
        +                "additionalProperties": true,
        +                "properties": {
        +                  "price": {
        +                    "description": "Coins, possibly abbreviated with k or m",
        +                    "type": [
        +                      "number",
        +                      "string"
        +                    ]
        +                  },
        +                  "trend": {
        +                    "type": "string"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "day180": {
        +                "additionalProperties": true,
        +                "type": "object"
        +              },
        +              "day30": {
        +                "additionalProperties": true,
        +                "type": "object"
        +              },
        +              "day90": {
        +                "additionalProperties": true,
        +                "type": "object"
        +              },
        +              "description": {
        +                "description": "In-game examine text",
        +                "type": "string"
        +              },
        +              "icon": {
        +                "description": "Small item icon URL",
        +                "type": "string"
        +              },
        +              "icon_large": {
        +                "description": "Large item icon URL",
        +                "type": "string"
        +              },
        +              "id": {
        +                "description": "Grand Exchange item ID",
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "members": {
        +                "description": "Whether the item requires membership; Jagex returns a string",
        +                "enum": [
        +                  "true",
        +                  "false"
        +                ],
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "today": {
        +                "additionalProperties": true,
        +                "type": "object"
        +              },
        +              "type": {
        +                "description": "Jagex catalogue category name",
        +                "type": "string"
        +              },
        +              "typeIcon": {
        +                "description": "Catalogue category icon URL",
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "item"
        +        ],
        +        "type": "object"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "Grand Exchange item ID",
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "query"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / succeeded
        Added value: +{
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "item"
        -]New value: +[]
    • Changedget_wiki_page_content8 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "page"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "pages"
        +    ]
        +  }
        +]
      • addedInput schema / properties / pages
        Added value: +{
        +  "description": "Wiki titles for a reference batch; exclusive with page",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "maxItems": 10,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "page"
        -]
      • addedOutput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "title",
        +      "url",
        +      "revisionId",
        +      "contentStatus",
        +      "text",
        +      "reason",
        +      "attribution"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "results",
        +      "succeeded",
        +      "failed"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / failed
        Added value: +{
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / results
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "oneOf": [
        +      {
        +        "required": [
        +          "data"
        +        ]
        +      },
        +      {
        +        "required": [
        +          "error"
        +        ]
        +      }
        +    ],
        +    "properties": {
        +      "data": {
        +        "$schema": "https://json-schema.org/draft/2020-12/schema",
        +        "additionalProperties": false,
        +        "properties": {
        +          "attribution": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "changes": {
        +                "type": "string"
        +              },
        +              "copyrightNotices": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "historyUrl": {
        +                "type": "string"
        +              },
        +              "license": {
        +                "anyOf": [
        +                  {
        +                    "type": "null"
        +                  },
        +                  {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "name": {
        +                        "type": "string"
        +                      },
        +                      "url": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "name",
        +                      "url"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "sourceUrl": {
        +                "type": "string"
        +              },
        +              "termsUrl": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "author",
        +              "sourceUrl",
        +              "historyUrl",
        +              "termsUrl",
        +              "changes",
        +              "copyrightNotices",
        +              "license"
        +            ],
        +            "type": "object"
        +          },
        +          "contentStatus": {
        +            "enum": [
        +              "link_only",
        +              "reviewed_extract"
        +            ]
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "revisionId": {
        +            "anyOf": [
        +              {
        +                "type": "integer"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "text": {
        +            "anyOf": [
        +              {
        +                "type": "string"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title",
        +          "url",
        +          "revisionId",
        +          "contentStatus",
        +          "text",
        +          "reason",
        +          "attribution"
        +        ],
        +        "type": "object"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "query": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "query"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / succeeded
        Added value: +{
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "title",
        -  "url",
        -  "revisionId",
        -  "contentStatus",
        -  "text",
        -  "reason",
        -  "attribution"
        -]New value: +[]
  11. 1 tool update
    • Changedsummarize_price_history1 field changed
      • changedOutput schema / properties / changePct / description
        Previous value: -"Percent change across the window, rounded to two decimals"New value: +"Percent change across the window, rounded to two decimals; 0 when the oldest price is 0"
  12. 11 tool updates
    • Changedbrowse_items1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": true,
        +  "properties": {
        +    "items": {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Jagex catalogue total",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedcompare_items1 field changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "names"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "itemIds"
        +    ]
        +  }
        +]
    • Changedestimate_flip6 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "itemId"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "name"
        +    ]
        +  }
        +]
      • addedInput schema / properties / buyLimitRemaining
        Added value: +{
        +  "description": "Caller-supplied remaining purchase quota in the current buy-limit window; 0 means none available",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / buyPrice / description
        Previous value: -"Buy price per item in coins. Defaults to the current market price."New value: +"Buy price per item in coins. Defaults to the latest Weirdgloop sample, then Jagex guide price."
      • addedInput schema / properties / fillTimeMinutes
        Added value: +{
        +  "description": "Caller-assumed minutes to buy and resell the full requested quantity, including any quota waits",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / sellPrice / description
        Previous value: -"Sell price per item in coins. Defaults to the current market price."New value: +"Sell price per item in coins. Defaults to the latest Weirdgloop sample, then Jagex guide price."
      • addedOutput schema / properties / executionScenario
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only for caller-supplied capacity or duration scenarios; not a market prediction",
        +  "properties": {
        +    "assumedFillTimeMinutes": {
        +      "type": "number"
        +    },
        +    "assumedNetProfitPerHour": {
        +      "description": "Full requested profit divided by caller-assumed round-trip hours",
        +      "type": "number"
        +    },
        +    "buyLimitRemaining": {
        +      "type": "integer"
        +    },
        +    "netProfitWithinBuyLimit": {
        +      "description": "Tax-adjusted profit on the quantity executable within the supplied quota",
        +      "type": "number"
        +    },
        +    "quantityOverBuyLimit": {
        +      "type": "integer"
        +    },
        +    "quantityWithinBuyLimit": {
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_all_categories1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "categories": {
        +      "description": "All 44 category references, sorted by ID",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "description": "Category ID (0-43)",
        +            "maximum": 43,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "categories"
        +  ],
        +  "type": "object"
        +}
    • Changedget_category_info1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": true,
        +  "properties": {
        +    "alpha": {
        +      "items": {
        +        "properties": {
        +          "items": {
        +            "description": "Number of catalogue items in this letter group",
        +            "type": "integer"
        +          },
        +          "letter": {
        +            "description": "Starting letter, or # for numbers",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "letter",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "types": {
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "types",
        +    "alpha"
        +  ],
        +  "type": "object"
        +}
    • Changedget_ge_info3 fields changed
      • removedOutput schema / description
        Removed value: -"Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\"."
      • addedOutput schema / properties
        Added value: +{
        +  "lastConfigUpdateRuneday": {
        +    "description": "RuneScape day counter for catalogue configuration update",
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "lastConfigUpdateRuneday"
        +]
    • Changedget_item_graph6 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "itemId"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "name"
        +    ]
        +  }
        +]
      • addedInput schema / properties / from
        Added value: +{
        +  "description": "First UTC date to include; omitted means start of available history",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / to
        Added value: +{
        +  "description": "Last UTC date to include; omitted means end of available history",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • removedOutput schema / description
        Removed value: -"Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\"."
      • addedOutput schema / properties
        Added value: +{
        +  "average": {
        +    "additionalProperties": {
        +      "type": "number"
        +    },
        +    "description": "Jagex averaged guide prices in coins, keyed by Unix timestamp in milliseconds",
        +    "type": "object"
        +  },
        +  "daily": {
        +    "additionalProperties": {
        +      "type": "number"
        +    },
        +    "description": "Daily guide prices in coins, keyed by Unix timestamp in milliseconds",
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "daily",
        +  "average"
        +]
    • Changedget_item_price4 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "itemId"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "name"
        +    ]
        +  }
        +]
      • removedOutput schema / description
        Removed value: -"Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\"."
      • addedOutput schema / properties
        Added value: +{
        +  "item": {
        +    "additionalProperties": true,
        +    "description": "Jagex catalogue item detail; prices are guide values, not executable offers",
        +    "properties": {
        +      "current": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "price": {
        +            "description": "Coins, possibly abbreviated with k or m",
        +            "type": [
        +              "number",
        +              "string"
        +            ]
        +          },
        +          "trend": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "day180": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "day30": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "day90": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "description": {
        +        "description": "In-game examine text",
        +        "type": "string"
        +      },
        +      "icon": {
        +        "description": "Small item icon URL",
        +        "type": "string"
        +      },
        +      "icon_large": {
        +        "description": "Large item icon URL",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Grand Exchange item ID",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "members": {
        +        "description": "Whether the item requires membership; Jagex returns a string",
        +        "enum": [
        +          "true",
        +          "false"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "today": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": {
        +        "description": "Jagex catalogue category name",
        +        "type": "string"
        +      },
        +      "typeIcon": {
        +        "description": "Catalogue category icon URL",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "item"
        +]
    • Changedget_wiki_page_content1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": false,
        +  "properties": {
        +    "attribution": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "author": {
        +          "type": "string"
        +        },
        +        "changes": {
        +          "type": "string"
        +        },
        +        "copyrightNotices": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "historyUrl": {
        +          "type": "string"
        +        },
        +        "license": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "additionalProperties": false,
        +              "properties": {
        +                "name": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "url"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "sourceUrl": {
        +          "type": "string"
        +        },
        +        "termsUrl": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "author",
        +        "sourceUrl",
        +        "historyUrl",
        +        "termsUrl",
        +        "changes",
        +        "copyrightNotices",
        +        "license"
        +      ],
        +      "type": "object"
        +    },
        +    "contentStatus": {
        +      "enum": [
        +        "link_only",
        +        "reviewed_extract"
        +      ]
        +    },
        +    "reason": {
        +      "type": "string"
        +    },
        +    "revisionId": {
        +      "anyOf": [
        +        {
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "text": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "title",
        +    "url",
        +    "revisionId",
        +    "contentStatus",
        +    "text",
        +    "reason",
        +    "attribution"
        +  ],
        +  "type": "object"
        +}
    • Addedsearch_wiki
    • Changedsummarize_price_history4 fields changed
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "required": [
        +      "itemId"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "name"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / avgDailyVolume / description
        Previous value: -"Average daily volume, when the source provided it"New value: +"Average daily volume rounded to a whole number, when the source provided it"
      • changedOutput schema / properties / avgPrice / description
        Previous value: -"Average price in the window, in coins"New value: +"Average price in the window, rounded to whole coins"
      • changedOutput schema / properties / changePct / description
        Previous value: -"Percent change across the window"New value: +"Percent change across the window, rounded to two decimals"
  13. 8 tool updates
    • 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"
        +}
    • 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"
        +}

Publisher details

Operator
Birdwell Labs · Publisher source
Vendor relationship
Independent · Publisher source
Trust center
Not available
Restrictions
Not applicable

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Look up Old School RuneScape Grand Exchange prices in real-time using the official OSRS Wiki Prices API, no API key required.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Answers whole player questions for Old School RuneScape in a single call — quest requirements and step-by-step guides, trip inventories fitted to 28 slots, item sources and live prices, monster drop tables, skill and money-making plans — by combining wiki data, real-time Grand Exchange prices, quest definitions and the player's own account. Supports saved-account personalization for main, ironman and other modes, returning compact sourced JSON with cached, freshness-stamped data.
    26
    12 npm
    2
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides read-only access to Old School RuneScape Wiki data, returning structured content with source provenance via MCP tools for searching pages, items, monsters, quests, shops, and drop sources.
    10
    176 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.