pathofbuilding-mcp 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,330 @@
1
+ Metadata-Version: 2.5
2
+ Name: pathofbuilding-mcp
3
+ Version: 0.4.0
4
+ Summary: MCP server that runs Path of Building Community's Lua calc engine headlessly
5
+ Project-URL: Homepage, https://github.com/wahid/pob-mcp
6
+ Keywords: mcp,model-context-protocol,path-of-building,path-of-exile,poe
7
+ Classifier: Operating System :: OS Independent
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Topic :: Games/Entertainment
10
+ Requires-Python: >=3.10
11
+ Requires-Dist: lupa>=2.0
12
+ Requires-Dist: mcp>=1.2
13
+ Requires-Dist: pillow>=9.2
14
+ Provides-Extra: test
15
+ Requires-Dist: pytest>=7; extra == 'test'
16
+ Description-Content-Type: text/markdown
17
+
18
+ # pob-mcp — Path of Building MCP server
19
+
20
+ An MCP server that runs **Path of Building Community** (Path of Exile 1) headlessly, so Claude
21
+ (or any MCP client) can read builds, get real PoB numbers, test changes and export the result.
22
+
23
+ It doesn't re-implement any game math: it boots PoB's own Lua code inside an embedded LuaJIT
24
+ (via [`lupa`](https://pypi.org/project/lupa/)), so every number matches what the PoB app shows
25
+ for the same build and config.
26
+
27
+ ## Tools
28
+
29
+ **Reading and evaluating**
30
+
31
+ | Tool | What it does |
32
+ |---|---|
33
+ | `load_build` | Load a share code, pobb.in / pastebin / poe.ninja / poedb link, raw XML, or a `.xml` file |
34
+ | `get_build_summary` | Class, ascendancy, level, point budget, main skill + headline stats |
35
+ | `get_stats` | Any stat from PoB's output table, by exact name or substring filter |
36
+ | `get_skills` | Socket groups and gems (indexes used by edits) |
37
+ | `get_items` | Equipped gear, flasks and tree jewels, with full item text |
38
+ | `get_passive_tree` | Keystones, notables, masteries, ascendancy nodes, tree URL |
39
+ | `get_config` / `list_config_options` | Current Configuration tab values / all options and choices |
40
+ | `get_warnings` | PoB's own warnings plus uncapped resists, unmet requirements, over-reservation, point overspend, gem errors |
41
+ | `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 |
42
+ | `evaluate_scenarios` | The build against mapping, pinnacle-boss and uber-boss setups (or your own config sets) in one call |
43
+ | `compare_builds` | Diff the loaded build against another (stats, keystones, notables, gems, gear) |
44
+ | `render_tree` | A picture of the passive tree with allocated nodes and an optional route highlighted |
45
+ | `list_item_sets` / `list_config_sets` | The build's gear sets (e.g. budget vs endgame) and config sets (e.g. mapping vs bossing) |
46
+
47
+ **Changing and optimising**
48
+
49
+ | Tool | What it does |
50
+ |---|---|
51
+ | `compare_changes` | **What-if**: apply edits, report stat deltas, then restore the build |
52
+ | `apply_changes` | Apply edits and keep them |
53
+ | `undo_last_change` | Roll back the last `apply_changes` or `auto_allocate_passives` |
54
+ | `rank_passives` | Rank reachable notables/keystones by gain per point (or allocated ones by least value, for respecs) for any stat |
55
+ | `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 |
56
+ | `fix_gaps` | Close resist and attribute gaps with valid suffixes in free slots on rare gear, then the cheapest tree nodes; preview or apply |
57
+ | `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 |
58
+ | `price_check` | poe.ninja prices for uniques, or for everything unique the build wears |
59
+ | `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 |
60
+ | `load_ladder_build` | Load a real poe.ninja ladder character (random, top, by rank, or by account/character; filter by ascendancy/skill) |
61
+ | `audit_config` | Switch off each enabled Configuration condition in turn and show what it was worth for DPS, EHP and max hits |
62
+ | `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 |
63
+ | `rank_anoints` | Every anointable notable ranked by its value on this build, with the oils needed |
64
+ | `list_ascendancy_notables` | Every ascendancy's notables (or one) with exact stats, read live from PoB |
65
+ | `list_keystones` | All keystones with their stats, allocation and path cost |
66
+ | `export_build` | Share code or XML, optionally saved to a file |
67
+ | `save_to_pob` | Save into PoB's Builds folder so it shows up in the PoB app |
68
+
69
+ **Creating builds**
70
+
71
+ | Tool | What it does |
72
+ |---|---|
73
+ | `new_build` | Empty build, optionally with ascendancy (sets the class too), class and level |
74
+ | `list_classes` | Classes, ascendancies and starting attributes |
75
+ | `search_gems` | Skill and support gems by name or tags, with descriptions |
76
+ | `search_uniques` | PoB's unique database by name, base, type or mod text |
77
+ | `search_item_bases` | Item bases for crafting rares, with implicits and base stats |
78
+ | `list_item_mods` | The mods that can actually roll on a base, with tiers and mod ids for `create_rare` |
79
+ | `list_cluster_jewel_options` | Cluster jewel enchants per size, and the notables each can roll (prefix/suffix, stats) |
80
+ | `find_passive_nodes` | Notables, keystones, jewel sockets and ascendancy nodes by name or stat text, with path cost |
81
+ | `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 |
82
+ | `find_routes` | 2–3 distinct cheapest routes to a node, with `via` / `avoid`, what each route picks up, and PoB-calculated stat changes |
83
+ | `list_mastery_effects` | Mastery options, for one mastery or every one you can allocate now |
84
+ | `list_item_slots` | Gear slots plus allocated tree jewel sockets |
85
+ | `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` |
86
+ | `plan_leveling` | Leveling trees (e.g. levels 30/50/70/90) built from the final tree, most valuable nodes first |
87
+ | `list_tree_specs` | The build's passive tree specs (final tree, leveling trees) |
88
+ | `import_character` | Import a character from a public pathofexile.com profile, or a saved character JSON |
89
+
90
+ **Working with PoB's Builds folder**
91
+
92
+ | Tool | What it does |
93
+ |---|---|
94
+ | `list_saved_builds` | Builds in PoB's Builds folder with class, ascendancy, level and last-modified time |
95
+ | `load_saved_build` | Load one by name; `save_to_pob` without a name then saves back to it |
96
+ | `watch_builds_folder` | Watch the folder for builds created, saved or deleted in the PoB app |
97
+ | `get_build_folder_changes` | What changed since the last check; optionally reload the loaded build from its file and show the stat changes |
98
+
99
+ Together these let you and the agent work on the same build: edit in PoB, save, and the agent
100
+ picks the change up; or let the agent save and press F5 in PoB.
101
+
102
+ ### Edit operations
103
+
104
+ Used by `compare_changes` and `apply_changes`. Several edits can go in one call.
105
+
106
+ | Area | Operations |
107
+ |---|---|
108
+ | Character | `set_class`, `set_ascendancy`, `set_level` |
109
+ | 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` |
110
+ | Tree specs | `add_tree_spec`, `switch_tree_spec`, `rename_tree_spec`, `delete_tree_spec` |
111
+ | Cluster jewels | `create_cluster_jewel` (socket, enchant, passive count, notables; validated against what can roll, then allocated) |
112
+ | Anoints | `anoint` (any anointable notable on the amulet) |
113
+ | Item sets | `add_item_set`, `switch_item_set`, `rename_item_set`, `delete_item_set` |
114
+ | Config sets | `add_config_set` (with values), `switch_config_set`, `rename_config_set`, `delete_config_set` |
115
+ | Skills | `create_socket_group`, `delete_socket_group`, `add_gem`, `remove_gem`, `replace_gem`, `set_gem`, `set_main_skill`, `set_group_enabled` |
116
+ | 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` |
117
+ | Config | `set_config`, `add_custom_mod` |
118
+
119
+ Gem names work with or without the "Support" suffix.
120
+
121
+ ## Setup
122
+
123
+ 1. **Get the PoB source** (the installed app lacks the headless support files):
124
+
125
+ ```
126
+ git clone https://github.com/PathOfBuildingCommunity/PathOfBuilding
127
+ ```
128
+
129
+ `git pull` it whenever PoB updates for a new league.
130
+
131
+ 2. **Install this package** (Python 3.10+):
132
+
133
+ ```
134
+ pip install ./pob-mcp
135
+ ```
136
+
137
+ For development, use `pip install -e ./pob-mcp` so code changes take effect without
138
+ reinstalling.
139
+
140
+ This pulls in `mcp`, `lupa` and `pillow` (for tree pictures). `lupa` ships its own
141
+ LuaJIT, so there's nothing else to install — no system Lua, no luarocks.
142
+
143
+ 3. **Add it to Claude Desktop** (`claude_desktop_config.json`):
144
+
145
+ ```json
146
+ {
147
+ "mcpServers": {
148
+ "path-of-building": {
149
+ "command": "pob-mcp",
150
+ "env": { "POB_PATH": "C:\\Users\\you\\PathOfBuilding" }
151
+ }
152
+ }
153
+ }
154
+ ```
155
+
156
+ If `pob-mcp` isn't on PATH, use `"command": "python", "args": ["-m", "pob_mcp"]`.
157
+ For Claude Code: `claude mcp add pob -e POB_PATH=/path/to/PathOfBuilding -- pob-mcp`.
158
+
159
+ `POB_PATH` can point at the checkout or its `src` folder; `--pob-path` works too. If unset, the
160
+ server looks in `~/PathOfBuilding`.
161
+
162
+ ## Example prompts
163
+
164
+ - "Load https://pobb.in/xxxx and tell me my weakest defensive layer."
165
+ - "What are the best 5 notables for my next points, by DPS per point? And for EHP?"
166
+ - "Which support in my main 6-link is weakest, and what should replace it?"
167
+ - "I need 10 points for a respec. Which notables cost me the least damage?"
168
+ - "Is anything wrong with this build?"
169
+ - "Which of these three notables gives the most DPS per point: …?"
170
+ - "Compare my current ring with this one: (pasted item text)."
171
+ - "Swap Controlled Destruction for Elemental Focus in my main link and show the difference against a Pinnacle boss."
172
+ - "Apply those changes and give me the new share code."
173
+ - "Create a level 95 Elementalist Arc build with a Tabula Rasa, cap my resists, and give me the share code."
174
+ - "Make a Deadeye Lightning Arrow build that balances damage and EHP, then tell me what gear to look for."
175
+
176
+ ## How it works
177
+
178
+ ```
179
+ MCP client ⇄ stdio ⇄ server.py (FastMCP/MCPServer)
180
+ │ one worker thread
181
+ ▼
182
+ engine.py ── lupa (embedded LuaJIT 2.1)
183
+ │
184
+ bridge.lua ── boots PoB (Launch.lua, Modules, Classes, Data)
185
+ and exposes a small JSON API
186
+ ```
187
+
188
+ - The first call takes ~5 seconds while PoB loads its data (the server starts this in the
189
+ background as soon as it launches). After that, calls are fast; a what-if comparison
190
+ takes well under a second.
191
+ - `rank_passives` and `rank_support_gems` use PoB's internal "misc calculator", the same
192
+ fast path behind its node power heatmap and its gem-list DPS sort. Ranking every notable
193
+ within 8 points takes a few seconds; ranking supports takes under a second.
194
+ - `compare_changes` snapshots the build as XML, applies the edits, recalculates, diffs the
195
+ stats and reloads the snapshot, so the loaded build is never changed.
196
+ - Stats depend on the build's Configuration tab (enemy type, conditions, charges…). Use
197
+ `get_config` to see assumptions and `set_config` edits to change them.
198
+
199
+ ### Compatibility shims (bridge.lua)
200
+
201
+ - PoB's bundled LuaJIT accepts compound assignment (`x += 1`, `s ..= t`). Stock LuaJIT
202
+ doesn't, so those lines are rewritten on load. Only files that fail to parse are touched.
203
+ - PoB's C `lua-utf8` module is replaced with stdlib string functions (only used for
204
+ thousands separators and text-box caret movement).
205
+ - `Inflate`/`Deflate` use Python's zlib.
206
+ - Nothing is written to stdout except MCP traffic; PoB's console output goes to stderr.
207
+
208
+ ### Passive tree routing
209
+
210
+ `get_tree_map` gives the agent the tree in a form it can reason about. Of the tree's ~2,900
211
+ nodes, the map keeps notables, keystones, jewel sockets, the class start and the small
212
+ passives where paths branch (~970 points); every unbranched run of small passives becomes one
213
+ edge with its length and stats:
214
+
215
+ ```
216
+ 50338 N Ballistics +5 | 20% increased Projectile Speed; 20% increased Projectile Damage; +20 to Dexterity
217
+ 465 J Projectile Damage and Attack Speed +2 | 4% increased Attack Speed; 10% increased Projectile Damage
218
+ 465-50338 3 | 3x 4% increased Attack Speed
219
+ ```
220
+
221
+ The whole main tree is ~13k tokens with names only; a 10-point region around the current
222
+ tree with full stats is ~7k. `find_routes` and `allocate_path` use the same pathing rules as
223
+ PoB: no passing through class starts, no continuing out of a mastery, no crossing between the
224
+ main tree and an ascendancy.
225
+
226
+ New builds without a level use PoB's auto-level mode, so the level (and level-based stats)
227
+ follows the points allocated. Pass a level to `new_build` to plan at a fixed level.
228
+
229
+ ### How an agent creates a build
230
+
231
+ 1. `new_build` with an ascendancy and level.
232
+ 2. `search_gems`, then a `create_socket_group` edit with `set_main` for the main skill, plus
233
+ groups for auras, movement and so on.
234
+ 3. Gear: `search_uniques` + `equip_unique`, or `search_item_bases` + `list_item_mods` +
235
+ `create_rare` with exact `affixes`, which guarantees an item that can exist (right mod pool,
236
+ item level, 3 prefixes / 3 suffixes, one mod per group).
237
+ 4. Ascendancy notables, keystones and must-have notables. For control over the route, look
238
+ at the area with `get_tree_map`, compare options with `find_routes`, and allocate the
239
+ chosen one with an `allocate_path` edit; `allocate_node` takes the shortest path.
240
+ 5. `auto_allocate_passives` for the remaining points, then `set_mastery` (each costs a point).
241
+ 6. `get_warnings`, then `fix_gaps` for resists and attributes.
242
+ 7. Optionally `plan_leveling`, `trade_search` per slot and `price_check` for the uniques.
243
+ 8. `export_build` for the share code, or `save_to_pob`.
244
+
245
+ `auto_allocate_passives` is greedy: it picks the best notable per point one step at a time,
246
+ which is fast and usually good, but it doesn't plan long paths toward distant clusters. Guide
247
+ it by allocating a few target notables first, or using `avoid`. A full tree takes 15–40
248
+ seconds; if it reaches its time limit, the progress is kept and calling it again continues.
249
+
250
+ ### Online features
251
+
252
+ `trade_search`, `price_check`, `popular_builds`, `load_ladder_build` and `import_character` use the internet; everything else runs
253
+ offline.
254
+
255
+ - **Prices** come from [poe.ninja](https://poe.ninja/docs/api). Responses are cached for 15
256
+ minutes, matching how often poe.ninja updates, and requests identify the app. poe.ninja asks
257
+ that published apps route requests through their own backend; for personal use on your own
258
+ machine this is that backend. Leave these tools unused if you'd rather not call poe.ninja.
259
+ - **Trade searches** are returned as links to open in your browser. pob-mcp doesn't query the
260
+ trade site itself.
261
+ - **Character import** uses the same public profile pages as PoB's Import tab, so the
262
+ profile's Characters tab must be public. Account names need their `#1234` suffix.
263
+
264
+ ## Build-designer skill
265
+
266
+ `skills/pob-build-designer/` is a Claude skill that teaches build making: picking a concept
267
+ with enough power, scaling damage through the right buckets, layering defenses against
268
+ community benchmarks, realistic gear, and spotting inflated PoB numbers. It drives the
269
+ tools above step by step and reads game data live (`list_ascendancy_notables`,
270
+ `list_keystones`, `list_item_mods`, ...) instead of hard-coding it. The knowledge is
271
+ paraphrased from r/PathOfExileBuilds and r/pathofexile threads listed in
272
+ `references/sources.md`.
273
+
274
+ The server also serves the guide itself, so any MCP client can use it: the
275
+ `read_build_guide` tool returns `SKILL.md` or one reference section, the `design_build` and
276
+ `review_build` prompts start a session with the method loaded, and each section is a
277
+ `pob-guide://<section>` resource. Set `POB_MCP_GUIDE=0` to switch this off.
278
+
279
+ Install it in Claude Code by copying the folder to `~/.claude/skills/` (or a project's
280
+ `.claude/skills/`), or upload the packaged `pob-build-designer.skill` in the Claude app
281
+ under Settings → Capabilities → Skills. `evals/` holds two test briefs.
282
+
283
+ ## Benchmark: rebuilding real ladder trees
284
+
285
+ `bench/tree_rebuild.py` measures how well the optimiser rebuilds real characters. For each
286
+ PoB build it records the original's main DPS and max hit per damage type, wipes the tree with
287
+ `reset_tree` (keeping ascendancy, keystones and socketed jewels; gear, gems and config stay),
288
+ and lets `auto_allocate_passives` spend the same points: maximise the DPS while reaching 98%
289
+ of every original max hit and keeping mana, life and attribute requirements valid. Results
290
+ are measured after a save and reload. A rebuild *matches* at ≥ 90% of the DPS with every max
291
+ hit ≥ 95%.
292
+
293
+ ```
294
+ python bench/tree_rebuild.py --pob-path ~/PathOfBuilding builds/*.xml --out results.json \
295
+ --max-path-cost 12 --lns-rounds 15 --save-dir rebuilt/
296
+ ```
297
+
298
+ Use `load_ladder_build` (or poe.ninja directly) to collect builds. On 19 random geared
299
+ ladder characters (one per ascendancy, November 2026) the optimiser matched 11 and beat the
300
+ original on 8; Claude with the build-design skill, driving the same tools, reached 91-94% of
301
+ the original DPS on two of the hardest misses where the optimiser alone reached 50-62%.
302
+
303
+ ## Testing
304
+
305
+ ```
306
+ pip install -e ".[test]"
307
+ POB_PATH=/path/to/PathOfBuilding pytest # offline tests (~1 min)
308
+ POB_PATH=/path/to/PathOfBuilding pytest -m online # poe.ninja check
309
+ ```
310
+
311
+ The suite drives PoB through every tool area using test builds that ship with PoB, plus one
312
+ test that starts the real server over stdio. `.github/workflows/test.yml` runs it on every push
313
+ and weekly against the latest PoB, so a league update that breaks something shows up quickly.
314
+
315
+ ## Limitations
316
+
317
+ - `popular_builds` reads poe.ninja's undocumented build API (protobuf search results and
318
+ binary string dictionaries). It works against the site as of November 2026 and may need
319
+ updating if poe.ninja changes its format; errors then say the format changed.
320
+
321
+ - PoE1 / PoB Community only (not PoB for PoE2).
322
+ - No character import from the PoE website (load a build code or XML instead).
323
+ - Timeless jewel seeds can't be set with the edit ops; edit them in PoB or paste the jewel
324
+ with `equip_item`.
325
+ - `create_rare` with free-text `mods` only warns about mods that can't roll (or errors with
326
+ `strict`); use `affixes` for guaranteed-valid items. Influence, veiled, fractured and essence
327
+ mods aren't in the pool; one bench craft can be added with `crafted`.
328
+ - `fix_gaps` fills free suffixes on rare gear and cheap tree nodes; it doesn't replace
329
+ existing mods or swap uniques.
330
+ - Weapon swap slots are hidden from `list_item_slots`.
@@ -0,0 +1,19 @@
1
+ pob_mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ pob_mcp/__main__.py,sha256=3dYKHfmWsrdExFlTFlcR5a_icR9fAkn06Yh14TQkEd8,33
3
+ pob_mcp/engine.py,sha256=zvpxekj-QYLPR8RLVyQHx9Z5OXXZAr7UozyefkxJ5Pg,7614
4
+ pob_mcp/library.py,sha256=2k0rRTix2iEfTPJVwu9qDxpYEqTReuXsFO8hhcGusVQ,5444
5
+ pob_mcp/online.py,sha256=ROntjukzV29lurCY4jJKODxSaYXDg3piQouAFYmrse8,18904
6
+ pob_mcp/render.py,sha256=HTH-yxyhr7B4R4_epKNS02BsQsZ3FqE7UhPfGt-yLxM,3338
7
+ pob_mcp/server.py,sha256=k0Ua-v8myOxW0IoZNmaW1eHcBZJ3di0XqCXzXBUBfTg,60865
8
+ pob_mcp/bridge.lua,sha256=ZDpi9Jfzqdlh07RV95pkGLDhfIQcHCRyVn9Trgp5fs0,168603
9
+ pob_mcp/skill/SKILL.md,sha256=FEJkoDNKMRdee61C923tSdUUEDsiWR_7hpteApM3O-E,14579
10
+ pob_mcp/skill/references/archetypes.md,sha256=_s0_fgIhhskAlBv8vf4b8es7gD9KP-g_nEcbCB-3WSE,4162
11
+ pob_mcp/skill/references/damage-scaling.md,sha256=IMhHoPrthu_hSwvEhDFJkzU0h8U9EJkpfaxMVm7_xsQ,9259
12
+ pob_mcp/skill/references/defense.md,sha256=S_TbXgXWFDDnMIn2Vs-ePtbSeVK-gw8KfFM39TsgBZA,8747
13
+ pob_mcp/skill/references/gear-and-progression.md,sha256=dKPOrXkA8puxcXA_3VrC5ujiiN4Y_rereh53o3n2fcc,4254
14
+ pob_mcp/skill/references/pob-pitfalls.md,sha256=iZK44HKhe_oomXuYJLTGIkj2byXO5voVTtjYhuqko_8,4878
15
+ pob_mcp/skill/references/sources.md,sha256=maV9B2_fhJ8-Z6L7VEyX1FgPCBj1JSQIBXCtzmvXWv8,2965
16
+ pathofbuilding_mcp-0.4.0.dist-info/METADATA,sha256=fvjHaqVNDOmKeGp5UcPlctJSVKQYOaOiCGHeWdhvH5w,19392
17
+ pathofbuilding_mcp-0.4.0.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
18
+ pathofbuilding_mcp-0.4.0.dist-info/entry_points.txt,sha256=-0sG-pCcGvKg9SFlPjQqidb59JQ1j6SKx_JZXh2uveY,59
19
+ pathofbuilding_mcp-0.4.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ pathofbuilding-mcp = pob_mcp.server:main
pob_mcp/__init__.py ADDED
File without changes
pob_mcp/__main__.py ADDED
@@ -0,0 +1,3 @@
1
+ from .server import main
2
+
3
+ main()