GW2 MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MODEL_ID | No | Model ID for the chosen LLM provider (optional). | claude-sonnet-5 |
| LLM_PROVIDER | No | LLM provider: 'anthropic', 'openai', or 'openrouter' (optional). | anthropic |
| DISCORD_TOKEN | No | Discord bot token (required for Discord adapter, not for MCP server). | |
| AUTHKIT_DOMAIN | No | AuthKit domain (required if MCP_AUTH_ENABLED=true). | |
| MCP_SERVER_URL | No | URL of a separately running MCP server (if not in-process). | |
| WORKOS_API_KEY | No | WorkOS API key (required if MCP_AUTH_ENABLED=true). | |
| PUBLIC_BASE_URL | No | Public base URL for OAuth callbacks (required if MCP_AUTH_ENABLED=true). | |
| LINK_SIGNING_KEY | No | Random cryptographic signing key for link flow (required if MCP_AUTH_ENABLED=true). | |
| MCP_AUTH_ENABLED | No | Enable OAuth authentication for HTTP MCP server (requires WorkOS config). | false |
| WORKOS_CLIENT_ID | No | WorkOS client ID (required if MCP_AUTH_ENABLED=true). | |
| ANTHROPIC_API_KEY | No | API key for Anthropic provider (required for agent core, not for MCP server alone). | |
| MONTHLY_BUDGET_USD | No | Monthly budget cap in USD (kill-switch, optional). | 50 |
| RATE_LIMIT_PER_USER | No | Per-user rate limit configuration (e.g., '5/10m', optional). | |
| RATE_LIMIT_PER_GUILD | No | Per-guild rate limit configuration (e.g., '30/1h', optional). | |
| ACCOUNT_SESSION_TTL_S | No | Browser session lifetime for /account page (optional). | 1800 |
| GW2_KEY_ENCRYPTION_KEY | No | Fernet key for encrypting GW2 API keys (required if MCP_AUTH_ENABLED=true). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| wiki_searchA | Search the official Guild Wars 2 wiki for pages matching a query. Returns up to |
| wiki_get_pageA | Fetch a Guild Wars 2 wiki page as cleaned plain text. Returns {title, url, text, truncated}. Infobox stats are preserved as
"name: value" lines. Skill/trait facts show the wiki's own computed
values with game-mode labels, e.g. "Damage: 646 (1.6) [PvE]" — the
flat number is the level-80 exotic tooltip value, the parenthesized
one the coefficient. Waypoint and point-of-interest listings include
in-game chat codes like "[&BDoBAAA=]" — relay them verbatim when
directing a player somewhere. Redirects are followed. If |
| get_event_timerA | Get upcoming start times for GW2 timed events: map meta events, world bosses, day/night cycles, and festival activities. Use this for any "when is the next X" or schedule question — wiki
pages render timers with browser JavaScript, so wiki_get_page can
never see them. |
| search_itemsA | Find GW2 item ids by (partial) item name. Returns {status, matches: [{id, name}]}. If status is "index_warming" the local name index is still being built — use the wiki instead or retry with a numeric id. Follow up with get_item / get_item_prices. |
| get_itemA | Fetch a GW2 item's static data (rarity, level, type, description) by id. |
| get_item_pricesA | Fetch live Trading Post buy/sell prices for an item id. Prices are in coins: 10000 coins = 1 gold, 100 coins = 1 silver.
|
| search_skillsB | Find GW2 skill ids by (partial) skill name. Same shape as search_items. |
| get_skillA | Fetch a GW2 skill's data (description, facts, recharge) by id. |
| search_waypointsA | Find GW2 waypoint and landmark (point of interest) chat codes and map locations by (partial) name. Returns {status, matches: [{name, type, chat_link, map, continent}]}.
|
| get_build_idA | Fetch the current game build number (useful to note data freshness). |
| get_daily_fractalsA | Fetch today's daily fractal achievements from the official API. |
| find_recipes_for_itemA | Find crafting recipe ids that PRODUCE the given item id. Use after search_items: item ids and recipe ids are different id spaces. Follow up with get_recipe for ingredients, and my_unlocks(kind="recipes", check_ids=[...]) to see if the user has learned a recipe. Empty recipe_ids means the item is not craftable. |
| get_recipeA | Fetch a crafting recipe by recipe id: disciplines, required rating, output item, and ingredients (item ids resolved to names). |
| my_accountB | The user's own GW2 account data (requires their stored API key). section="overview": account name, world, access, ranks. section="wallet": currency balances with names (coins: 10000 = 1 gold). If the result contains an "action" field, relay it to the user — it explains how to set up or fix their API key. |
| my_storageA | The user's account-wide storage: bank, material storage, or shared inventory slots (requires their stored API key). Item stacks come back aggregated with names resolved; pass name_filter (substring) to narrow — responses cap at 100 entries. If the result contains an "action" field, relay it to the user. |
| my_charactersA | The user's characters (requires their stored API key). section="list" (no name needed): character names. With name: "overview" (core stats), "inventory" (bag contents, aggregated, name_filter supported), "equipment" (worn gear with upgrades/stats preserved), "crafting" (disciplines + ratings). If the result contains an "action" field, relay it to the user. |
| my_unlocksA | The user's unlocks (requires their stored API key). kinds: recipes, dyes, skins, minis, outfits, gliders, mounts, home_nodes. Default: unlocked count only. check_ids (max 50): membership test — the way to answer "does the user know recipe X / own skin Y?" (mounts and home_nodes use string ids). list_missing=true: locked entries with names — only for dyes/minis/outfits/gliders/mounts/home_nodes. If the result contains an "action" field, relay it to the user. |
| my_progressA | The user's progression (requires their stored API key). kinds: achievements (requires achievement_ids, max 50 — find ids via the wiki or public tools first), masteries, raids, dungeons, worldbosses, mapchests, wizards_vault. raids/dungeons/worldbosses/mapchests list the encounters/chests cleared since their last reset. Note: the GW2 API has no per-map/world completion percentage — use achievements. If the result contains an "action" field, relay it to the user. |
| account_infoA | Where and how to manage your GW2 API key for account-aware features. Returns the /account web page URL plus non-secret status (whether a key is stored, tier, Discord link). NEVER ask the user to paste an API key into the conversation — send them to the URL instead. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Guild-Wars-MCP/GW2_MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server