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.
- 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
Scored across 14 tools
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.
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.
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.
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 toolsbrowse_itemsBrowse Catalogue ItemsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (starting from 1) | |
| alpha | No | Starting letter (a-z) or # for numbers. Defaults to "a". | |
| category | Yes | Category ID (0-43) |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| total | No | Jagex catalogue total |
TDQS
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.
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.
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.
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.
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.
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 ProfitARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | Known GE item ID resolved with lookup_item | |
| buyPrice | No | Buy price per item in coins. Defaults to the latest Weirdgloop sample, then Jagex guide price. | |
| quantity | No | Number of items to flip (default 1) | |
| sellPrice | No | Sell price per item in coins. Defaults to the latest Weirdgloop sample, then Jagex guide price. | |
| fillTimeMinutes | No | Caller-assumed minutes to buy and resell the full requested quantity, including any quota waits | |
| buyLimitRemaining | No | Caller-supplied remaining purchase quota in the current buy-limit window; 0 means none available |
Output Schema
| Name | Required | Description |
|---|---|---|
| itemId | Yes | |
| taxRate | No | |
| buyPrice | Yes | Buy price per item in coins |
| itemName | No | |
| quantity | Yes | |
| totalTax | No | |
| marginPct | No | |
| netProfit | Yes | |
| sellPrice | Yes | Sell price per item in coins |
| taxPerUnit | No | |
| assumptions | No | |
| grossProfit | No | |
| netProfitPerUnit | No | |
| executionScenario | No | Present only for caller-supplied capacity or duration scenarios; not a market prediction |
| breakEvenSellPrice | No |
TDQS
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.
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.
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.
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.
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.
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 MetadataARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Metadata view; omit for the original configuration status result | status |
| category | No | Category ID (0-43) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 DataARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Detailed Jagex records (original default) or compact Weirdgloop comparison snapshots | records |
| itemId | No | Known GE item ID resolved with lookup_item | |
| itemIds | No | GE IDs of the target candidates | |
| includeLiveData | No | Optional trade/mapping enrichment for the records view |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 JournalARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | Exact RS3 player display name |
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | Counts over the returned journal: completed + started + notStarted equals total. |
| quests | Yes | Complete journal entries returned by RuneMetrics |
| source | Yes | RuneMetrics journal request URL |
| username | Yes | Trimmed input echoed back; not a separate canonical-identity lookup |
| fetchedAt | Yes | UTC retrieval time for this uncached journal |
TDQS
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.
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.
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.
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.
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.
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 StatsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| gameMode | No | Hiscores board (default: normal) | normal |
| username | Yes | Player username to lookup |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 HistoryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last UTC date to include; omitted means end of available history | |
| days | No | Sample window for the statistics view | |
| from | No | First UTC date to include; omitted means start of available history | |
| view | No | Raw observations (original default) or computed Weirdgloop statistics | observations |
| itemId | Yes | Known GE item ID resolved with lookup_item | |
| source | No | History data provider; allowed values and defaults depend on view |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 FactsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | Literal source article title, e.g. Abyssal demon; not an item ID or URL | |
| limit | No | Maximum rows in this response | |
| offset | No | nextOffset from a prior result; omit to start | |
| variant | No | Exact sourceReference for one variant of the resolved article |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| rows | Yes | |
| fetchedAt | Yes | |
| sourceUrl | Yes | |
| nextOffset | Yes | Continue with this offset; null means the index page ended or the 10000 offset bound was reached |
| skippedRows | Yes |
TDQS
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.
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.
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.
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.
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.
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 FactsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Structured dataset: combat monster statistics or quest metadata | |
| page | Yes | Wiki page title, e.g. Abyssal demon or Cook's Assistant; redirects are resolved | |
| limit | No | Maximum variant records from the selected page (default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| page | Yes | Canonical Wiki page title |
| records | Yes | |
| fetchedAt | Yes | |
| sourceUrl | Yes | |
| truncated | Yes | Additional indexed variants exceeded the requested limit |
| attribution | Yes |
TDQS
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.
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.
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.
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.
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.
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 ReferencesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Wiki page title (spaces allowed; redirects are followed) | |
| pages | No | Wiki titles for a reference batch; exclusive with page |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| text | No | |
| title | No | |
| failed | No | |
| reason | No | |
| results | No | |
| succeeded | No | |
| revisionId | No | |
| attribution | No | |
| contentStatus | No |
TDQS
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.
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.
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.
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.
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.
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 MembersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows in this response | |
| cursor | No | Opaque nextCursor from this category; omit for its first page | |
| category | Yes | Wiki category title including Category:, e.g. Category:Weapons |
Output Schema
| Name | Required | Description |
|---|---|---|
| members | Yes | |
| category | Yes | |
| fetchedAt | Yes | |
| sourceUrl | Yes | |
| nextCursor | Yes | |
| skippedRows | Yes | |
| contentStatus | Yes |
TDQS
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.
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.
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.
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.
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.
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 ItemARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches to return (default 5) | |
| query | Yes | Item name or partial name to search for |
Output Schema
| Name | Required | Description |
|---|---|---|
| matches | Yes | Matching Grand Exchange items, best match first |
TDQS
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.
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.
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.
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.
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.
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 ActivityARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | Desired RS3 outcome in plain language, e.g. best Mining quest or train Mining to level 70; not instructions to execute arbitrary tools. | |
| unlock | No | Named 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. | |
| context | No | Optional known account facts; missing facts are not fabricated. | |
| goalType | No | activity 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. | |
| targetLevel | No | Destination 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. | |
| targetSkill | No | Exact 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
| Name | Required | Description |
|---|---|---|
| goal | Yes | Caller goal after input normalization. |
| usage | Yes | Paid Jev rounds, input/output token counts, model names and round budget. |
| status | Yes | Outcome: recommended proposes a candidate; needs_context requests facts; no_match has no supported option; goal_met means the target is already satisfied. |
| account | Yes | Resolved account context with caller/public sources and unknown facts preserved. |
| sources | Yes | Evidence references, retrieval/revision details and attribution where applicable. |
| warnings | Yes | Data gaps, coverage limits and conditions the caller should communicate. |
| unlockPlan | No | Named unlock and its prerequisite quest/skill progression, when applicable. |
| alternatives | Yes | Other supported candidates; not an exhaustive catalogue. |
| trainingPlan | No | Training target, XP gap, methods and prerequisites when the training planner ran. |
| questCoverage | No | Quest journal/catalogue comparison coverage, when the quest planner ran. |
| questDecision | No | Quest selection evidence and eligibility reasoning. |
| missingContext | Yes | Account facts or target details still needed for a confident plan. |
| recommendation | Yes | Top candidate or null; the planner-specific recommendation is supported by sources and may remain conditional. |
| unlockCoverage | No | Unlock evidence coverage and unresolved requirements. |
| trainingCoverage | No | Training evidence coverage and its limitations. |
| blockedAlternatives | No | Rejected or blocked candidates with their known conditions. |
TDQS
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.
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.
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.
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.
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.
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 PagesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max pages to return (default 5) | |
| query | Yes | Words to search for on the RuneScape Wiki |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Matching RuneScape Wiki pages, best match first |
TDQS
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.
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.
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.
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.
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.
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.
2 tool updates
- Added
get_player_quests - Added
recommend_next_activity
2 tool updates
- Changed
get_item_details3 fields changed- removed
Input schema / examplesRemoved value: -[ - { - "itemId": 4151 - }, - { - "itemIds": [ - 4151, - 536 - ] - }, - { - "includeLiveData": true, - "itemId": 4151 - } -] - changed
Input schema / properties / includeLiveData / descriptionPrevious 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" - changed
Input schema / properties / itemIds / descriptionPrevious value: -"Known GE IDs for ordered record batches or comparison snapshots; exclusive with itemId"New value: +"GE IDs of the target candidates"
- Changed
get_price_series2 fields changed- changed
Input schema / properties / days / descriptionPrevious value: -"Defaults to 30 trailing usable daily samples for statistics only; not a calendar-date range"New value: +"Sample window for the statistics view" - changed
Input schema / properties / source / descriptionPrevious 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"
5 tool updates
- Removed
compare_item_prices - Changed
estimate_flip4 fields changed- removed
Input schema / oneOfRemoved value: -[ - { - "required": [ - "itemId" - ] - }, - { - "required": [ - "name" - ] - } -] - changed
Input schema / properties / itemId / descriptionPrevious value: -"Grand Exchange item ID (provide itemId or name)"New value: +"Known GE item ID resolved with lookup_item" - removed
Input schema / properties / nameRemoved value: -{ - "description": "Item name (provide itemId or name). Prefer lookup_item for fuzzy search.", - "minLength": 1, - "type": "string" -} - added
Input schema / requiredAdded value: +[ + "itemId" +]
- Changed
get_item_details12 fields changed- changed
Input schema / examplesPrevious value: -[ - { - "itemId": 4151 - }, - { - "name": "Abyssal whip" - }, - { - "itemIds": [ - 4151, - 536 - ] - }, - { - "includeLiveData": true, - "itemId": 4151 - } -]New value: +[ + { + "itemId": 4151 + }, + { + "itemIds": [ + 4151, + 536 + ] + }, + { + "includeLiveData": true, + "itemId": 4151 + } +] - changed
Input schema / oneOfPrevious 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" + ] + } +] - changed
Input schema / properties / itemId / descriptionPrevious value: -"Grand Exchange item ID (provide itemId or name)"New value: +"Known GE item ID resolved with lookup_item" - changed
Input schema / properties / itemIds / descriptionPrevious 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" - removed
Input schema / properties / nameRemoved value: -{ - "description": "Item name (provide itemId or name). Prefer lookup_item for fuzzy search.", - "minLength": 1, - "type": "string" -} - added
Input schema / properties / viewAdded value: +{ + "default": "records", + "description": "Detailed Jagex records (original default) or compact Weirdgloop comparison snapshots", + "enum": [ + "records", + "comparison" + ], + "type": "string" +} - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / anyOfAdded 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" + } +] - removed
Output schema / oneOfRemoved value: -[ - { - "required": [ - "item" - ] - }, - { - "required": [ - "results", - "succeeded", - "failed" - ] - } -] - removed
Output schema / propertiesRemoved 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" - } -} - removed
Output schema / requiredRemoved value: -[]
- Changed
get_price_series14 fields changed- changed
Input schema / oneOfPrevious 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" + ] + } +] - added
Input schema / properties / daysAdded value: +{ + "description": "Defaults to 30 trailing usable daily samples for statistics only; not a calendar-date range", + "maximum": 90, + "minimum": 7, + "type": "integer" +} - changed
Input schema / properties / itemId / descriptionPrevious value: -"Grand Exchange item ID (provide itemId or name)"New value: +"Known GE item ID resolved with lookup_item" - removed
Input schema / properties / nameRemoved value: -{ - "description": "Item name (provide itemId or name)", - "minLength": 1, - "type": "string" -} - removed
Input schema / properties / source / defaultRemoved value: -"jagex" - changed
Input schema / properties / source / descriptionPrevious 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." - added
Input schema / properties / viewAdded value: +{ + "default": "observations", + "description": "Raw observations (original default) or computed Weirdgloop statistics", + "enum": [ + "observations", + "statistics" + ], + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "itemId" +] - removed
Output schema / $schemaRemoved value: -"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / anyOfAdded 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" + } +] - removed
Output schema / oneOfRemoved value: -[ - { - "required": [ - "daily", - "average" - ] - }, - { - "required": [ - "itemId", - "source", - "samples" - ] - } -] - removed
Output schema / propertiesRemoved 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" - } -} - removed
Output schema / requiredRemoved value: -[]
- Removed
summarize_price_history
4 tool updates
- Removed
get_all_categories - Removed
get_category_info - Changed
get_ge_info11 fields changed- added
Input schema / oneOfAdded value: +[ + { + "not": { + "required": [ + "category" + ] + }, + "properties": { + "view": { + "enum": [ + "status", + "categories" + ] + } + } + }, + { + "properties": { + "view": { + "const": "category_counts" + } + }, + "required": [ + "view", + "category" + ] + } +] - added
Input schema / propertiesAdded 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" + } +} - removed
Output schema / additionalPropertiesRemoved value: -true - removed
Output schema / properties / categoryCountRemoved value: -{ - "description": "Number of canonical GE categories", - "type": "integer" -} - removed
Output schema / properties / configurationAgeDaysRemoved value: -{ - "description": "UTC calendar days since configuration update; negative for a future upstream date", - "type": "integer" -} - removed
Output schema / properties / fetchedAtRemoved value: -{ - "description": "Server retrieval time, not a price update timestamp", - "format": "date-time", - "type": "string" -} - removed
Output schema / properties / lastConfigUpdateDateRemoved value: -{ - "description": "Configuration UTC date derived from RuneDay", - "format": "date", - "type": "string" -} - removed
Output schema / properties / lastConfigUpdateRunedayRemoved value: -{ - "description": "Upstream RuneDay counter for catalogue configuration update", - "type": "integer" -} - removed
Output schema / properties / priceFreshnessRemoved value: -{ - "const": "not_reported", - "description": "Configuration metadata does not report item-price freshness" -} - added
Output schema / properties / resultAdded 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" + } + ] +} - changed
Output schema / requiredPrevious value: -[ - "lastConfigUpdateRuneday", - "lastConfigUpdateDate", - "configurationAgeDays", - "fetchedAt", - "categoryCount", - "priceFreshness" -]New value: +[ + "result" +]
- Changed
summarize_price_history1 field changed- changed
Output schema / properties / avgDailyVolume / descriptionPrevious 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"
2 tool updates
- Added
get_wiki_drop_table - Added
list_wiki_category_members
6 tool updates
- Added
compare_item_prices - Removed
compare_items - Added
get_item_details - Removed
get_item_graph - Removed
get_item_price - Added
get_price_series
2 tool updates
- Changed
get_item_price6 fields changed- changed
Input schema / examplesPrevious value: -[ - { - "itemId": 4151 - }, - { - "name": "Abyssal whip" - }, - { - "itemIds": [ - 4151, - 536 - ] - } -]New value: +[ + { + "itemId": 4151 + }, + { + "name": "Abyssal whip" + }, + { + "itemIds": [ + 4151, + 536 + ] + }, + { + "includeLiveData": true, + "itemId": 4151 + } +] - added
Input schema / properties / includeLiveDataAdded 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" +} - added
Output schema / properties / item / properties / liveTradesAdded 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" +} - added
Output schema / properties / item / properties / wikiFactsAdded 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" + ] +} - added
Output schema / properties / results / items / properties / data / properties / item / properties / liveTradesAdded 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" +} - added
Output schema / properties / results / items / properties / data / properties / item / properties / wikiFactsAdded 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" + ] +}
- Added
get_wiki_entity_facts
1 tool update
- Changed
get_item_price1 field changed- added
Input schema / examplesAdded value: +[ + { + "itemId": 4151 + }, + { + "name": "Abyssal whip" + }, + { + "itemIds": [ + 4151, + 536 + ] + } +]
2 tool updates
- Changed
get_item_graph6 fields changed- added
Input schema / properties / sourceAdded value: +{ + "default": "jagex", + "description": "Provider/shape: Jagex daily+average maps (default), or raw Weirdgloop daily samples", + "enum": [ + "jagex", + "weirdgloop" + ], + "type": "string" +} - added
Output schema / oneOfAdded value: +[ + { + "required": [ + "daily", + "average" + ] + }, + { + "required": [ + "itemId", + "source", + "samples" + ] + } +] - added
Output schema / properties / itemIdAdded value: +{ + "description": "Grand Exchange item ID", + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / samplesAdded 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" +} - added
Output schema / properties / sourceAdded value: +{ + "const": "weirdgloop", + "description": "Present for the Weirdgloop sample-array variant" +} - changed
Output schema / requiredPrevious value: -[ - "daily", - "average" -]New value: +[]
- Changed
get_item_price2 fields changed- added
Output schema / properties / item / properties / wikiUrlAdded value: +{ + "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search", + "format": "uri", + "type": "string" +} - added
Output schema / properties / results / items / properties / data / properties / item / properties / wikiUrlAdded value: +{ + "description": "Wiki item-ID lookup link; redirects to the corresponding article without a title search", + "format": "uri", + "type": "string" +}
3 tool updates
- Changed
get_ge_info7 fields changed- added
Output schema / properties / categoryCountAdded value: +{ + "description": "Number of canonical GE categories", + "type": "integer" +} - added
Output schema / properties / configurationAgeDaysAdded value: +{ + "description": "UTC calendar days since configuration update; negative for a future upstream date", + "type": "integer" +} - added
Output schema / properties / fetchedAtAdded value: +{ + "description": "Server retrieval time, not a price update timestamp", + "format": "date-time", + "type": "string" +} - added
Output schema / properties / lastConfigUpdateDateAdded value: +{ + "description": "Configuration UTC date derived from RuneDay", + "format": "date", + "type": "string" +} - changed
Output schema / properties / lastConfigUpdateRuneday / descriptionPrevious value: -"RuneScape day counter for catalogue configuration update"New value: +"Upstream RuneDay counter for catalogue configuration update" - added
Output schema / properties / priceFreshnessAdded value: +{ + "const": "not_reported", + "description": "Configuration metadata does not report item-price freshness" +} - changed
Output schema / requiredPrevious value: -[ - "lastConfigUpdateRuneday" -]New value: +[ + "lastConfigUpdateRuneday", + "lastConfigUpdateDate", + "configurationAgeDays", + "fetchedAt", + "categoryCount", + "priceFreshness" +]
- Changed
get_item_price7 fields changed- changed
Input schema / oneOfPrevious value: -[ - { - "required": [ - "itemId" - ] - }, - { - "required": [ - "name" - ] - } -]New value: +[ + { + "required": [ + "itemId" + ] + }, + { + "required": [ + "name" + ] + }, + { + "required": [ + "itemIds" + ] + } +] - added
Input schema / properties / itemIdsAdded 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 +} - added
Output schema / oneOfAdded value: +[ + { + "required": [ + "item" + ] + }, + { + "required": [ + "results", + "succeeded", + "failed" + ] + } +] - added
Output schema / properties / failedAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / resultsAdded 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" +} - added
Output schema / properties / succeededAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "item" -]New value: +[]
- Changed
get_wiki_page_content8 fields changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "page" + ] + }, + { + "required": [ + "pages" + ] + } +] - added
Input schema / properties / pagesAdded value: +{ + "description": "Wiki titles for a reference batch; exclusive with page", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "page" -] - added
Output schema / oneOfAdded value: +[ + { + "required": [ + "title", + "url", + "revisionId", + "contentStatus", + "text", + "reason", + "attribution" + ] + }, + { + "required": [ + "results", + "succeeded", + "failed" + ] + } +] - added
Output schema / properties / failedAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / resultsAdded 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" +} - added
Output schema / properties / succeededAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "title", - "url", - "revisionId", - "contentStatus", - "text", - "reason", - "attribution" -]New value: +[]
1 tool update
- Changed
summarize_price_history1 field changed- changed
Output schema / properties / changePct / descriptionPrevious 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"
11 tool updates
- Changed
browse_items1 field changed- changed
Output 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" +}
- Changed
compare_items1 field changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "names" + ] + }, + { + "required": [ + "itemIds" + ] + } +]
- Changed
estimate_flip6 fields changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "itemId" + ] + }, + { + "required": [ + "name" + ] + } +] - added
Input schema / properties / buyLimitRemainingAdded value: +{ + "description": "Caller-supplied remaining purchase quota in the current buy-limit window; 0 means none available", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / buyPrice / descriptionPrevious 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." - added
Input schema / properties / fillTimeMinutesAdded value: +{ + "description": "Caller-assumed minutes to buy and resell the full requested quantity, including any quota waits", + "exclusiveMinimum": 0, + "type": "number" +} - changed
Input schema / properties / sellPrice / descriptionPrevious 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." - added
Output schema / properties / executionScenarioAdded 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" +}
- Changed
get_all_categories1 field changed- changed
Output 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" +}
- Changed
get_category_info1 field changed- changed
Output 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" +}
- Changed
get_ge_info3 fields changed- removed
Output schema / descriptionRemoved value: -"Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\"." - added
Output schema / propertiesAdded value: +{ + "lastConfigUpdateRuneday": { + "description": "RuneScape day counter for catalogue configuration update", + "type": "integer" + } +} - added
Output schema / requiredAdded value: +[ + "lastConfigUpdateRuneday" +]
- Changed
get_item_graph6 fields changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "itemId" + ] + }, + { + "required": [ + "name" + ] + } +] - added
Input schema / properties / fromAdded value: +{ + "description": "First UTC date to include; omitted means start of available history", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / toAdded value: +{ + "description": "Last UTC date to include; omitted means end of available history", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - removed
Output schema / descriptionRemoved value: -"Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\"." - added
Output schema / propertiesAdded 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" + } +} - added
Output schema / requiredAdded value: +[ + "daily", + "average" +]
- Changed
get_item_price4 fields changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "itemId" + ] + }, + { + "required": [ + "name" + ] + } +] - removed
Output schema / descriptionRemoved value: -"Raw Jagex JSON. Price fields may be integers or compact strings such as \"80k\"." - added
Output schema / propertiesAdded 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" + } +} - added
Output schema / requiredAdded value: +[ + "item" +]
- Changed
get_wiki_page_content1 field changed- changed
Output 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" +}
- Added
search_wiki - Changed
summarize_price_history4 fields changed- added
Input schema / oneOfAdded value: +[ + { + "required": [ + "itemId" + ] + }, + { + "required": [ + "name" + ] + } +] - changed
Output schema / properties / avgDailyVolume / descriptionPrevious value: -"Average daily volume, when the source provided it"New value: +"Average daily volume rounded to a whole number, when the source provided it" - changed
Output schema / properties / avgPrice / descriptionPrevious value: -"Average price in the window, in coins"New value: +"Average price in the window, rounded to whole coins" - changed
Output schema / properties / changePct / descriptionPrevious value: -"Percent change across the window"New value: +"Percent change across the window, rounded to two decimals"
8 tool updates
- Changed
compare_items1 field changed- changed
Output 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" +}
- Changed
estimate_flip1 field changed- changed
Output 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" +}
- Changed
get_ge_info1 field changed- changed
Output 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" +}
- Changed
get_item_graph1 field changed- changed
Output 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" +}
- Changed
get_item_price1 field changed- changed
Output 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" +}
- Changed
get_player_stats1 field changed- changed
Output 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" +}
- Changed
lookup_item1 field changed- changed
Output 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" +}
- Changed
summarize_price_history1 field changed- changed
Output 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
- Operator website
- https://birdwellabs.com · Publisher source
- Vendor relationship
- Independent · Publisher source
- Trust center
- Not available
- Restrictions
- Not applicable
Related MCP Connectors
Read-only Roblox Limiteds market data: RAP, resale prices, deals below RAP, creators, portfolios.
TibiaWiki knowledge base: attribute queries over creatures, items, NPCs, quests and spells
Read-only PC game search, current store offers and recorded price history. No account required.
GW1 build compiler: skill data, template code encode/decode, validation, hero roster. Read-only.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceLook up Old School RuneScape Grand Exchange prices in real-time using the official OSRS Wiki Prices API, no API key required.-
- AlicenseAqualityBmaintenanceAnswers 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.2612 npm2MIT
- AlicenseAqualityBmaintenanceProvides 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.10176 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server for the Old School RuneScape Wiki, game data, Grand Exchange prices, and hiscores with polite client behavior.6 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.