pob-mcp — Path of Building MCP server
An MCP server that runs Path of Building Community (Path of Exile 1) headlessly, so Claude (or any MCP client) can read builds, get real PoB numbers, test changes and export the result.
pip install pathofbuilding-mcp
It also needs a checkout of the Path of Building source; see Setup.
It doesn't re-implement any game math: it boots PoB's own Lua code inside an embedded LuaJIT
(via lupa), so every number matches what the PoB app shows
for the same build and config.
Tools
Reading and evaluating
| Tool | What it does |
|---|---|
load_build |
Load a share code, pobb.in / pastebin / poe.ninja / poedb link, raw XML, or a .xml file |
get_build_summary |
Class, ascendancy, level, point budget, main skill + headline stats |
get_stats |
Any stat from PoB's output table, by exact name or substring filter |
get_skills |
Socket groups and gems (indexes used by edits) |
get_items |
Equipped gear, flasks and tree jewels, with full item text |
get_passive_tree |
Keystones, notables, masteries, ascendancy nodes, tree URL |
get_config / list_config_options |
Current Configuration tab values / all options and choices |
get_warnings |
PoB's own warnings plus uncapped resists, unmet requirements, over-reservation, point overspend, gem errors |
explain_stat |
Where a stat comes from: PoB's breakdown plus every modifier source (tree node, item, gem) with its value. Pass a damage type ("Lightning") for base, added, increased and more per source type, conversion and enemy resistance |
evaluate_scenarios |
The build against mapping, pinnacle-boss and uber-boss setups (or your own config sets) in one call |
compare_builds |
Diff the loaded build against another (stats, keystones, notables, gems, gear) |
render_tree |
A picture of the passive tree with allocated nodes and an optional route highlighted |
list_item_sets / list_config_sets |
The build's gear sets (e.g. budget vs endgame) and config sets (e.g. mapping vs bossing) |
Changing and optimising
| Tool | What it does |
|---|---|
compare_changes |
What-if: apply edits, report stat deltas, then restore the build |
apply_changes |
Apply edits and keep them |
undo_last_change |
Roll back the last apply_changes or auto_allocate_passives |
rank_passives |
Rank reachable notables/keystones by gain per point (or allocated ones by least value, for respecs) for any stat |
rank_support_gems |
Rank every compatible support gem for a link, as an extra gem or as a replacement, plus what each current support contributes |
fix_gaps |
Close resist and attribute gaps with valid suffixes in free slots on rare gear, then the cheapest tree nodes; preview or apply |
trade_search |
A pathofexile.com trade search for upgrades in a slot: every mod that can roll there is weighted by its PoB-calculated value |
price_check |
poe.ninja prices for uniques, or for everything unique the build wears |
popular_builds |
What ladder players run (poe.ninja): share of characters using each ascendancy, main skill, keystone, unique, anoint, mastery and gem, filtered by ascendancy and/or skill |
load_ladder_build |
Load a real poe.ninja ladder character (random, top, by rank, or by account/character; filter by ascendancy/skill) |
audit_config |
Switch off each enabled Configuration condition in turn and show what it was worth for DPS, EHP and max hits |
rank_gear_upgrades |
The best single mod change per rare slot (new mod in a free affix or replacing the weakest), with resist-cap warnings |
rank_anoints |
Every anointable notable ranked by its value on this build, with the oils needed |
list_ascendancy_notables |
Every ascendancy's notables (or one) with exact stats, read live from PoB |
list_keystones |
All keystones with their stats, allocation and path cost |
export_build |
Share code or XML, optionally saved to a file |
save_to_pob |
Save into PoB's Builds folder so it shows up in the PoB app |
Creating builds
| Tool | What it does |
|---|---|
new_build |
Empty build, optionally with ascendancy (sets the class too), class and level |
list_classes |
Classes, ascendancies and starting attributes |
search_gems |
Skill and support gems by name or tags, with descriptions |
search_uniques |
PoB's unique database by name, base, type or mod text |
search_item_bases |
Item bases for crafting rares, with implicits and base stats |
list_item_mods |
The mods that can actually roll on a base, with tiers and mod ids for create_rare |
list_cluster_jewel_options |
Cluster jewel enchants per size, and the notables each can roll (prefix/suffix, stats) |
find_passive_nodes |
Notables, keystones, jewel sockets and ascendancy nodes by name or stat text, with path cost |
get_tree_map |
The passive tree as a condensed graph (notables, keystones, sockets and branch points, joined by chains of small passives with their stats); whole tree or a region |
find_routes |
2–3 distinct cheapest routes to a node, with via / avoid, what each route picks up, and PoB-calculated stat changes |
list_mastery_effects |
Mastery options, for one mastery or every one you can allocate now |
list_item_slots |
Gear slots plus allocated tree jewel sockets |
auto_allocate_passives |
Greedy optimiser: spends points on the notables with the best weighted gain per point, e.g. {"FullDPS": 1, "TotalEHP": 0.5}. Optional targets (e.g. {"PhysicalMaximumHitTaken": 10000}) are met first and never broken afterwards; also picks mastery effects, sockets planned jewels, and can anoint |
plan_leveling |
Leveling trees (e.g. levels 30/50/70/90) built from the final tree, most valuable nodes first |
list_tree_specs |
The build's passive tree specs (final tree, leveling trees) |
import_character |
Import a character from a public pathofexile.com profile, or a saved character JSON |
Working with PoB's Builds folder
| Tool | What it does |
|---|---|
list_saved_builds |
Builds in PoB's Builds folder with class, ascendancy, level and last-modified time |
load_saved_build |
Load one by name; save_to_pob without a name then saves back to it |
watch_builds_folder |
Watch the folder for builds created, saved or deleted in the PoB app |
get_build_folder_changes |
What changed since the last check; optionally reload the loaded build from its file and show the stat changes |
Together these let you and the agent work on the same build: edit in PoB, save, and the agent picks the change up; or let the agent save and press F5 in PoB.
Edit operations
Used by compare_changes and apply_changes. Several edits can go in one call.
| Area | Operations |
|---|---|
| Character | set_class, set_ascendancy, set_level |
| Passive tree | allocate_node (shortest path; works for ascendancy nodes and jewel sockets), allocate_path (exactly the listed nodes, e.g. a route from find_routes), deallocate_node, set_mastery |
| Tree specs | add_tree_spec, switch_tree_spec, rename_tree_spec, delete_tree_spec |
| Cluster jewels | create_cluster_jewel (socket, enchant, passive count, notables; validated against what can roll, then allocated) |
| Anoints | anoint (any anointable notable on the amulet) |
| Item sets | add_item_set, switch_item_set, rename_item_set, delete_item_set |
| Config sets | add_config_set (with values), switch_config_set, rename_config_set, delete_config_set |
| Skills | create_socket_group, delete_socket_group, add_gem, remove_gem, replace_gem, set_gem, set_main_skill, set_group_enabled |
| Items | equip_unique, create_rare (exact affixes by mod id, always valid; or free-text mods, checked against the base's mod pool), create_flask (magic flask from mod ids, switched on), set_flask_active, equip_timeless (timeless jewel by seed and conqueror), equip_item (pasted item text), unequip_slot |
| Config | set_config, add_custom_mod |
Gem names work with or without the "Support" suffix.
Setup
-
Get the PoB source (the installed app lacks the headless support files):
git clone https://github.com/PathOfBuildingCommunity/PathOfBuildinggit pullit whenever PoB updates for a new league. -
Install this package (Python 3.10+) from PyPI:
pip install pathofbuilding-mcppip install -U pathofbuilding-mcpupdates it. For development, clone this repo and usepip install -e .so code changes take effect without reinstalling.This pulls in
mcp,lupaandpillow(for tree pictures).lupaships its own LuaJIT, so there's nothing else to install — no system Lua, no luarocks. -
Add it to Claude Desktop (
claude_desktop_config.json):{ "mcpServers": { "path-of-building": { "command": "pathofbuilding-mcp", "env": { "POB_PATH": "C:\\Users\\you\\PathOfBuilding" } } } }
If
pathofbuilding-mcpisn't on PATH, use"command": "python", "args": ["-m", "pob_mcp"]. For Claude Code:claude mcp add pob -e POB_PATH=/path/to/PathOfBuilding -- pathofbuilding-mcp.
POB_PATH can point at the checkout or its src folder; --pob-path works too. If unset, the
server looks in ~/PathOfBuilding.
Example prompts
- "Load https://pobb.in/xxxx and tell me my weakest defensive layer."
- "What are the best 5 notables for my next points, by DPS per point? And for EHP?"
- "Which support in my main 6-link is weakest, and what should replace it?"
- "I need 10 points for a respec. Which notables cost me the least damage?"
- "Is anything wrong with this build?"
- "Which of these three notables gives the most DPS per point: …?"
- "Compare my current ring with this one: (pasted item text)."
- "Swap Controlled Destruction for Elemental Focus in my main link and show the difference against a Pinnacle boss."
- "Apply those changes and give me the new share code."
- "Create a level 95 Elementalist Arc build with a Tabula Rasa, cap my resists, and give me the share code."
- "Make a Deadeye Lightning Arrow build that balances damage and EHP, then tell me what gear to look for."
How it works
MCP client ⇄ stdio ⇄ server.py (FastMCP/MCPServer)
│ one worker thread
▼
engine.py ── lupa (embedded LuaJIT 2.1)
│
bridge.lua ── boots PoB (Launch.lua, Modules, Classes, Data)
and exposes a small JSON API
- The first call takes ~5 seconds while PoB loads its data (the server starts this in the background as soon as it launches). After that, calls are fast; a what-if comparison takes well under a second.
rank_passivesandrank_support_gemsuse PoB's internal "misc calculator", the same fast path behind its node power heatmap and its gem-list DPS sort. Ranking every notable within 8 points takes a few seconds; ranking supports takes under a second.compare_changessnapshots the build as XML, applies the edits, recalculates, diffs the stats and reloads the snapshot, so the loaded build is never changed.- Stats depend on the build's Configuration tab (enemy type, conditions, charges…). Use
get_configto see assumptions andset_configedits to change them.
Compatibility shims (bridge.lua)
- PoB's bundled LuaJIT accepts compound assignment (
x += 1,s ..= t). Stock LuaJIT doesn't, so those lines are rewritten on load. Only files that fail to parse are touched. - PoB's C
lua-utf8module is replaced with stdlib string functions (only used for thousands separators and text-box caret movement). Inflate/Deflateuse Python's zlib.- Nothing is written to stdout except MCP traffic; PoB's console output goes to stderr.
Passive tree routing
get_tree_map gives the agent the tree in a form it can reason about. Of the tree's ~2,900
nodes, the map keeps notables, keystones, jewel sockets, the class start and the small
passives where paths branch (~970 points); every unbranched run of small passives becomes one
edge with its length and stats:
50338 N Ballistics +5 | 20% increased Projectile Speed; 20% increased Projectile Damage; +20 to Dexterity
465 J Projectile Damage and Attack Speed +2 | 4% increased Attack Speed; 10% increased Projectile Damage
465-50338 3 | 3x 4% increased Attack Speed
The whole main tree is ~13k tokens with names only; a 10-point region around the current
tree with full stats is ~7k. find_routes and allocate_path use the same pathing rules as
PoB: no passing through class starts, no continuing out of a mastery, no crossing between the
main tree and an ascendancy.
New builds without a level use PoB's auto-level mode, so the level (and level-based stats)
follows the points allocated. Pass a level to new_build to plan at a fixed level.
How an agent creates a build
new_buildwith an ascendancy and level.search_gems, then acreate_socket_groupedit withset_mainfor the main skill, plus groups for auras, movement and so on.- Gear:
search_uniques+equip_unique, orsearch_item_bases+list_item_mods+create_rarewith exactaffixes, which guarantees an item that can exist (right mod pool, item level, 3 prefixes / 3 suffixes, one mod per group). - Ascendancy notables, keystones and must-have notables. For control over the route, look
at the area with
get_tree_map, compare options withfind_routes, and allocate the chosen one with anallocate_pathedit;allocate_nodetakes the shortest path. auto_allocate_passivesfor the remaining points, thenset_mastery(each costs a point).get_warnings, thenfix_gapsfor resists and attributes.- Optionally
plan_leveling,trade_searchper slot andprice_checkfor the uniques. export_buildfor the share code, orsave_to_pob.
auto_allocate_passives is greedy: it picks the best notable per point one step at a time,
which is fast and usually good, but it doesn't plan long paths toward distant clusters. Guide
it by allocating a few target notables first, or using avoid. A full tree takes 15–40
seconds; if it reaches its time limit, the progress is kept and calling it again continues.
Online features
trade_search, price_check, popular_builds, load_ladder_build and import_character use the internet; everything else runs
offline.
- Prices come from poe.ninja. Responses are cached for 15 minutes, matching how often poe.ninja updates, and requests identify the app. poe.ninja asks that published apps route requests through their own backend; for personal use on your own machine this is that backend. Leave these tools unused if you'd rather not call poe.ninja.
- Trade searches are returned as links to open in your browser. pob-mcp doesn't query the trade site itself.
- Character import uses the same public profile pages as PoB's Import tab, so the
profile's Characters tab must be public. Account names need their
#1234suffix.
Build-designer skill
skills/pob-build-designer/ is a Claude skill that teaches build making: picking a concept
with enough power, scaling damage through the right buckets, layering defenses against
community benchmarks, realistic gear, and spotting inflated PoB numbers. It drives the
tools above step by step and reads game data live (list_ascendancy_notables,
list_keystones, list_item_mods, ...) instead of hard-coding it. The knowledge is
paraphrased from r/PathOfExileBuilds and r/pathofexile threads listed in
references/sources.md.
The server also serves the guide itself, so any MCP client can use it: the
read_build_guide tool returns SKILL.md or one reference section, the design_build and
review_build prompts start a session with the method loaded, and each section is a
pob-guide://<section> resource. Set POB_MCP_GUIDE=0 to switch this off.
Install it in Claude Code by copying the folder to ~/.claude/skills/ (or a project's
.claude/skills/), or upload the packaged pob-build-designer.skill in the Claude app
under Settings → Capabilities → Skills. evals/ holds two test briefs.
Benchmark: rebuilding real ladder trees
bench/tree_rebuild.py measures how well the optimiser rebuilds real characters. For each
PoB build it records the original's main DPS and max hit per damage type, wipes the tree with
reset_tree (keeping ascendancy, keystones, socketed jewels and the route to distance-scaling
jewels such as Split Personality; gear, gems and config stay), and lets
auto_allocate_passives spend the same points: maximise the DPS while reaching 98% of every
original max hit, the original's spell suppression and block chances, and keeping mana, life
and attribute requirements valid. Each strategy (targets-first, blend, slack, repair)
is tried and the best feasible tree kept. Results are measured after a save and reload. A
rebuild matches at ≥ 90% of the DPS with every max hit ≥ 95%.
python bench/tree_rebuild.py --pob-path ~/PathOfBuilding builds/*.xml --out results.json \
--strategies slack,repair,targets-first --lns-rounds 20 --save-dir rebuilt/
Use load_ladder_build (or poe.ninja directly) to collect builds. On 19 random geared
ladder characters (one per ascendancy, November 2026) the optimiser matches 17 and beats the
original on 9. The two left (Gladiator 82%, Hierophant 85% of the DPS, both at every max-hit
target) are trees where the defense targets compete with damage for the same few points.
bench/results/README.md has the per-build numbers.
Testing
pip install -e ".[test]"
POB_PATH=/path/to/PathOfBuilding pytest # offline tests (~1 min)
POB_PATH=/path/to/PathOfBuilding pytest -m online # poe.ninja check
The suite drives PoB through every tool area using test builds that ship with PoB, plus one
test that starts the real server over stdio. .github/workflows/test.yml runs it on every push
and weekly against the latest PoB, so a league update that breaks something shows up quickly.
Limitations
-
popular_buildsreads poe.ninja's undocumented build API (protobuf search results and binary string dictionaries). It works against the site as of November 2026 and may need updating if poe.ninja changes its format; errors then say the format changed. -
PoE1 / PoB Community only (not PoB for PoE2).
-
No character import from the PoE website (load a build code or XML instead).
-
Timeless jewel seeds can't be set with the edit ops; edit them in PoB or paste the jewel with
equip_item. -
create_rarewith free-textmodsonly warns about mods that can't roll (or errors withstrict); useaffixesfor guaranteed-valid items. Influence, veiled, fractured and essence mods aren't in the pool; one bench craft can be added withcrafted. -
fix_gapsfills free suffixes on rare gear and cheap tree nodes; it doesn't replace existing mods or swap uniques. -
Weapon swap slots are hidden from
list_item_slots.
Metadata
Release files for pathofbuilding-mcp 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pathofbuilding_mcp-0.5.0.tar.gz | 138.7 kB | With provenance | Details for pathofbuilding_mcp-0.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pathofbuilding_mcp-0.5.0-py3-none-any.whl | Python 3 | none | any | Details for pathofbuilding_mcp-0.5.0-py3-none-any.whl |
Total release size: 253.8 kB
Release files / pathofbuilding_mcp-0.5.0.tar.gz
| Download URL | pathofbuilding_mcp-0.5.0.tar.gz |
|---|---|
| Size | 138.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
efd908200cc8f8e0d9590387a17ff7ccd72a0b6b6fcec18543cced197f994c48
|
|
BLAKE2b-256 checksum How to use checksums |
81d9ec64d1ff024cc738d8f079dd7a650e303640730af183d622fd2a0c00951c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logRelease files / pathofbuilding_mcp-0.5.0-py3-none-any.whl
| Download URL | pathofbuilding_mcp-0.5.0-py3-none-any.whl |
|---|---|
| Size | 115.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3c0c50c27de4a6319bad1a3b8bb9b9b5b1d6bb757a85fb7161d84a9dd0e5f026
|
|
BLAKE2b-256 checksum How to use checksums |
414178c60652339d9b2b176077c6bde6a09f9b7dde1fc01014334148b2addca4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logSecurity for pathofbuilding-mcp 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for pathofbuilding_mcp-0.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.