poe2-build-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| POB_LUAJIT | No | Override path to LuaJIT executable (defaults to C:\msys64\ucrt64\bin\luajit.exe on Windows) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| import_buildA | Import a Path of Exile 2 build for analysis and theorycrafting.
Shared PoBs are often aspirational, so the result carries |
| get_build_statsA | Return Path-of-Building-computed stats for the currently loaded build. Pass |
| get_buildA | Full read-back of the active build. Returns class/level/ascendancy, the main skill group (gems + levels), allocated notables/keystones/ascendancy nodes, equipped gear by slot, passive points used, and summary stats — so you can see the whole build you've assembled. |
| get_defensesA | Defensive summary for the active build: life/ES/mana/ward, armour/evasion, block,
elemental + chaos resistances (with over-cap), and TotalEHP. Elemental resists are shown
net of PoB's configurable area penalty (default Endgame -60%); the response includes the
active |
| export_buildA | Export the active build as a Path of Building import code. Paste the returned |
| new_buildA | Reset to a blank build — clears gear, skills, passives, and config. Use this to start a build truly from scratch mid-session: |
| set_classA | Set the active build's character class and (optionally) ascendancy.
|
| set_levelA | Set the active build's character level (1-100). Returns updated stats. |
| set_skillA | Set the active build's MAIN skill (gem + its support gems) in PoB paste format. Format: " / ", e.g. " 20/0 1". List the main skill first,
then its supports — one gem per line, OR separated inline by " / ", "," or "|" (all accepted);
a bare support name gets a default level/quality (supports are fixed-effect
in PoE2, so it's cosmetic). This REPLACES the current main skill group; auras/heralds/reservation buffs
added via |
| add_skill_groupA | Add an ENABLED secondary skill group (aura, herald, or persistent buff) WITHOUT changing the main skill — so its buff/reservation applies to the active build. This is how you model the damage layers that carry endgame casters/attackers: auras, heralds,
and reservation/mana-scaling buffs, etc. Same paste format as Set |
| set_configA | Set combat/configuration options and/or extra modifiers on the active build.
|
| apply_combat_profileA | Apply a realistic boss-combat profile in one call, so DPS reflects an actual fight. The engine's enemy-condition levers are OFF by default, so a bare IMPORTANT — these are ASSUMPTIONS the build must actually produce: only keep |
| list_config_optionsA | List Path of Building configuration options usable with Covers combat conditions, charges, enemy settings, exposure, etc. Filter with |
| equip_itemA | Equip an item on the active build from raw Path of Building item text. Replaces whatever is currently in the target slot. Hand-written items are checked against the real mod pool: if an affix can't roll on the base
type (e.g. flat/ |
| unequip_itemA | Clear an equipment slot on the active build (e.g. "Ring 2", "Body Armour", "Weapon 1"). Weapon-swap slots ("Weapon 1 Swap"/"Weapon 2 Swap") and jewel sockets are valid slots too;
use |
| list_jewel_socketsA | List the passive tree's jewel sockets: each socket's |
| equip_jewelA | Socket a jewel (raw PoB item text) into a passive-tree jewel socket.
|
| evaluate_buildA | Check the active build against named numeric goals.
|
| pinnacle_readinessA | Gate a build against the endgame/pinnacle checklist — defense beyond raw EHP, plus a DPS bar. Engine-computed pass/fail for: elemental resists capped, chaos handled (capped OR Chaos
Inoculation), a resist over-cap buffer (advisory, vs penetration/curses), EHP ≥ |
| compare_toA | Compare the active build against another build (code/link/XML) without losing it. Snapshots the current build, loads |
| solve_forA | Solve for the magnitude of one modifier needed to reach a stat target on the active build. Holds the build fixed and binary-searches
Scope: ONE lever, ONE (increasing) metric. It does not balance survivability or cost and reports a requirement — verify with get_defenses / evaluate_build and confirm the magnitude is attainable via search_mods / find_supports_for. |
| rank_leversA | Rank which stat levers give the most Applies each lever at |
| list_leversA | List the named levers accepted by Returns the recognized lever names plus guidance: names are forgiving (a directional phrase like "increased lightning damage" works even if unlisted), and you can pass any PoB mod text containing "{}" as a custom lever. A lever only moves a metric if it actually applies to the build (crit needs a crit build, attack speed needs an attack skill, the damage type must match). |
| search_passivesA | Search the active build's passive tree by node name or stat text.
|
| get_passiveA | Return a passive node's details by id (preferred) or exact name. |
| alloc_passiveA | Allocate a passive node (and the shortest path to it) by id or name. Returns points spent and the resulting stat deltas. Fails if the node isn't reachable from the currently allocated tree. |
| dealloc_passiveA | Deallocate a passive node (and nodes that depend on it) by id or name. Returns points freed and the resulting stat deltas. |
| optimize_passivesA | Greedily allocate passive points to maximize a goal on the active build. Three goal modes:
|
| scaffold_gearA | Fill the active build's EMPTY armour/jewellery slots with placeholder BASELINE gear. Closes the build's actual defensive gaps so a from-scratch skeleton becomes engine-
evaluable: it adds only the resistances that are below |
| optimize_itemA | Craft the best-in-slot rare for a Searches the slot's REAL craftable affix pool (from the base's mod restrictions) and greedily
fills prefixes/suffixes — respecting the 3/3 limits and mod-group exclusivity. Every candidate is
engine-computed. For realistic gear, pass Each result also reports |
| rank_upgradesA | Rank gear slots by upgrade potential — "what should I craft/upgrade next?". Recrafts each gear slot to its best (same crafter as optimize_item — a single |
| optimize_supportsA | Choose the best support-gem set for the active main skill (engine-measured). Supports are usually a build's biggest "more" multiplier, but the corpus stores no support
MAGNITUDES — so this values them empirically. It picks the candidate pool by MEASUREMENT, not
tags (solo-measuring each tag-relevant support and keeping the strongest, so premier levers like
penetration aren't missed just because they share few tags), then greedily adds the support that
most raises the goal on the REAL build, round by round, until the sockets are full or nothing
helps. Pass |
| optimize_jewelA | Craft the best-in-slot rare JEWEL for the active build (one metric or a weighted goals blend). A jewel's explicit mods apply globally, so each candidate is measured as a real modifier on the
build and ranked by marginal gain (jewel mods are ~independent, so the top picks ≈ the best
jewel). Pick a |
| plan_gearA | Plan a whole gear set that maximizes damage while capping resistances (budget allocation). The cross-slot trade-off: limited suffix slots for resistances, so put them where they cost the
least damage. This crafts OFFENSE slots damage-leaning and DEFENSE slots EHP-leaning (which pulls
the missing resists onto the defensive pieces), building each slot on the previous so the plan is
coherent. |
| craft_itemA | Craft the best-in-slot item using the FULL crafting system — beyond a plain rare. Where |
| optimize_buildA | Assemble a complete, engine-verified, high-DPS build for the ACTIVE archetype — the holistic optimizer that does the synthesis the greedy per-slot tools can't (STATE tool: leaves the best build LOADED in the session). Set up the archetype first (class + ascendancy + main skill, plus a weapon base for attack skills — it's archetype-defining), then call this. It SEEDS the dominant levers from the reference set for the build's delivery, and for each runs "commit-and-max": REQUIRE the lever's tree clusters
|
| engine_healthA | Report engine + install diagnostics: liveness, LuaJIT and passive-tree versions, the installed data/server versions, and whether data is served from the auto-updated user-data copy or the bundled seed — so you can confirm exactly what's running. |
| search_itemsA | Search Path of Exile 2 item bases by name/tags, optionally filtered by item class. Returns matching bases (name, item_class, drop_level, tags). Use |
| get_itemA | Return full data for a single item base by exact name or metadata id. |
| find_skillsB | Find skill/support gems by text, tag, color, or type.
|
| get_gemB | Return full data for a single gem by name or id (tags, granted skills, supports, types). |
| find_supports_forA | List support gems for a skill: curated recommendations + tag-compatible supports (most
relevant first). This only LISTS candidates — to actually pick the best set, use
|
| explain_mechanicA | Explain a Path of Exile 2 mechanic (corpus — offline, deterministic). Returns our evergreen |
| search_mechanicsA | Full-text search the bundled wiki mechanics tier (corpus — offline, deterministic). Returns matching page titles + snippets + source links so you can pick one to read with
|
| relevant_mechanicsA | The mechanics worth understanding for the ACTIVE build (corpus + engine). Reads the current build's signals — main skill + its tags (and the ailment its damage type builds), keystones, ascendancy notables, plus staples — and points each at its best corpus mechanics page. Also surfaces the engine's damage diagnostic, so an uncomputable layer (reservation buff, undamageable minion, %-life/corpse detonation) is called out up front. Use it when starting/auditing a build to read up before theorycrafting. |
| build_adviceA | Evergreen PoE2 build-optimization principles — durable rules, not a meta snapshot. Omit |
| list_reference_buildsA | Browse engine-verified reference / CALIBRATION builds (corpus — offline, deterministic). A deliberately diverse set of real high-end builds across many ascendancies/skills, kept ONLY
to calibrate. They are not templates: never copy, export, or recommend one wholesale when a
user asks for a build — build to the USER's stated goal and use these to sanity-check it. Filter
by |
| benchmark_buildA | Calibrate the ACTIVE build against the verified reference set (corpus + engine). Compares this build's computed DPS/EHP to the distribution of real high-end builds of the SAME delivery archetype (spell/attack/minion/…), and reports which levers those references scale on. Answers "is this build's number in a sane endgame range, and what should I scale next?" — it is a calibration check, NOT a license to copy a reference. The user's goal drives the build; if a number is low, find the missing multiplier on THIS build (rank_levers), don't clone a reference. |
| parse_itemA | Parse a Path of Exile 2 item (in-game clipboard or PoB item text) and enrich it. For each explicit affix, identifies its mod group and the tier it rolled (T1 = best)
using the corpus' per-tier ranges, and reports open prefix/suffix slots for craftable
rarities. Use it to evaluate a drop or plan a craft ("is this worth using / can I add
more?"). Tiers and ranges are looked-up corpus facts — to see how the item changes a build,
equip it with |
| list_ascendanciesA | List Path of Exile 2 ascendancies, optionally filtered by base class. |
| search_modsA | Search Path of Exile 2 affixes/modifiers by readable text.
|
| reverse_lookupA | Find where a stat comes from: matching affixes, gems, and unique items. Example: reverse_lookup("maximum life") or reverse_lookup("increased fire damage"). |
| search_uniquesA | Search Path of Exile 2 unique items by name, base, or mod text.
|
| get_uniqueA | Return a unique item's full readable text (base, mods) by name. If the name is a base type rather than a unique (e.g. "Warmonger Bow"), says so and points to get_item, instead of returning a confusing null. |
| relevant_uniquesA | Surface unique items + unique JEWELS that synergize with the ACTIVE build (corpus suggestions). Matches the active main skill's scaling — its damage type, skill type (spell/attack/projectile/…)
and the skill name — against unique mod text, ranked by how many match. Uniques often DEFINE or
ENABLE a build (extra projectiles, "+levels to skills", a converted mechanic), and unique JEWELS
(Voices, Megalomaniac, …) supply the passive/notable density meta trees lean on — exactly the
power a from-scratch, rare-only build misses. These are CANDIDATES, not verified: a unique often
enables a mechanic, so read full text with |
| corpus_infoA | Report the bundled game-data corpus version and entity counts. |
| get_pricesA | Look up live Path of Exile 2 market prices (poe2scout.com).
|
| list_price_leaguesA | List Path of Exile 2 leagues available for pricing (with the current one flagged). |
| get_meta_buildsA | Live ascendancy popularity from poe.ninja's ladder snapshot — CONTEXT, not a target. Returns the most-played ascendancies for a league (default the current challenge league) with each one's share % and a rising/falling/flat trend, plus the sample size. This is popularity among logged ladder characters, not a recommendation — popular is not the same as optimal or right for the player's goal. Use it to inform, not dictate: build to the user's stated goal, and only steer toward the meta when they explicitly ask for the "strongest"/"popular"/"meta" option. Covers ascendancy distribution only (no skill/item meta). Returns {ok: false} if poe.ninja is unreachable. |
| lookup_mechanicA | Fetch a concise mechanic/skill/item explanation LIVE from the PoE2 Wiki (live — network). The long-tail escape hatch: use this only when |
| check_data_versionA | Compare the bundled game-data corpus against upstream and report the current league. |
| update_corpusA | Rebuild the game-data corpus locally from RePoE (power-user / offline path). Most users don't need this — the server auto-updates from validated releases. Pass rebuild_from_source=true to re-fetch RePoE and rebuild the corpus right now. |
| check_for_updatesA | Check whether a newer validated release (engine + corpus) is available to install. |
| apply_updatesA | Download and install the latest validated release (engine + corpus) now. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| start_build_session | Start a Path of Exile 2 build session — orients the assistant to drive the poe2-build tools. |
| analyze_build | Import a PoB build and produce a grounded analysis with improvement ideas. |
| build_from_goal | Create a verified build from a natural-language goal (create → validate → cost → present). |
| audit_defenses | Audit the active build's survivability and propose fixes. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- 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/MaxWilk/poe2-build-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server