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). |
Capabilities
Features and capabilities supported by this server
| 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_search | Search the official Guild Wars 2 wiki for pages matching a query. Returns up to |
| wiki_get_page | 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_timer | 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_items | 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_item | Fetch a GW2 item's static data (rarity, level, type, description) by id. |
| get_item_prices | Fetch live Trading Post buy/sell prices for an item id. Prices are in coins: 10000 coins = 1 gold, 100 coins = 1 silver.
|
| search_skills | Find GW2 skill ids by (partial) skill name. Same shape as search_items. |
| get_skill | Fetch a GW2 skill's data (description, facts, recharge) by id. |
| search_waypoints | 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_id | Fetch the current game build number (useful to note data freshness). |
| get_daily_fractals | Fetch today's daily fractal achievements from the official API. |
| find_recipes_for_item | 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_recipe | Fetch a crafting recipe by recipe id: disciplines, required rating, output item, and ingredients (item ids resolved to names). |
| my_account | 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_info | 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