atraxis-sdk 0.1.0__tar.gz

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,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .mypy_cache/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .venv/
7
+ dist/
8
+ build/
9
+ *.egg-info/
10
+
@@ -0,0 +1,10 @@
1
+ # История изменений
2
+
3
+ ## 0.1.0 — 2026-09-13
4
+
5
+ - Добавлены синхронный и асинхронный клиенты всех шести методов Atraxis API.
6
+ - Добавлены неизменяемые модели, безопасные ошибки, пагинация и ограниченные повторы.
7
+ - Добавлен локальный MCP-сервер с отдельным явным разрешением на изменения.
8
+ - Добавлена проверяемая публичная копия OpenAPI-контракта.
9
+ - Документация поясняет способы пополнения склада и ограничения выдачи через API.
10
+ - Направление операции определяется по `from` и `to`.
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Atraxis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,173 @@
1
+ Metadata-Version: 2.5
2
+ Name: atraxis-sdk
3
+ Version: 0.1.0
4
+ Summary: Official Python SDK and local MCP server for the Atraxis public API
5
+ Project-URL: Documentation, https://atraxisonline.com/developers/api
6
+ Project-URL: Repository, https://github.com/Atraxis/Python-SDK
7
+ Project-URL: Issues, https://github.com/Atraxis/Python-SDK/issues
8
+ Author: Atraxis
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: api,atraxis,mcp,sdk
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: httpx<1,>=0.28
24
+ Provides-Extra: dev
25
+ Requires-Dist: build<2,>=1.3; extra == 'dev'
26
+ Requires-Dist: hatchling<2,>=1.27; extra == 'dev'
27
+ Requires-Dist: mcp<3,>=2.2; extra == 'dev'
28
+ Requires-Dist: mypy<2,>=1.15; extra == 'dev'
29
+ Requires-Dist: pytest-asyncio<2,>=0.25; extra == 'dev'
30
+ Requires-Dist: pytest<10,>=8.3; extra == 'dev'
31
+ Requires-Dist: pyyaml<7,>=6; extra == 'dev'
32
+ Requires-Dist: ruff<1,>=0.11; extra == 'dev'
33
+ Provides-Extra: mcp
34
+ Requires-Dist: mcp<3,>=2.2; extra == 'mcp'
35
+ Description-Content-Type: text/markdown
36
+
37
+ # Atraxis Python SDK
38
+
39
+ Официальный SDK для владельцев гильдий и лавок Atraxis. Он помогает подключить к гильдии
40
+ своего бота, сайт или учётную систему: посмотреть склад, работать с внутренними валютами,
41
+ выдавать ценности игрокам и получать историю операций.
42
+
43
+ ```bash
44
+ pip install atraxis-sdk
45
+ ```
46
+
47
+ Требуется Python 3.10 или новее. Перед началом лидер гильдии выпускает приватный токен
48
+ в разделе «Интеграции гильдии». Храните его как пароль: токен даёт доступ к операциям
49
+ вашей гильдии.
50
+
51
+ ## Быстрый старт
52
+
53
+ ```python
54
+ from atraxis import AtraxisClient, CurrencyTransfer
55
+
56
+ with AtraxisClient("agk_example.redacted") as client:
57
+ for item in client.iter_warehouse():
58
+ print(item.warehouse_item_id, item.name, item.quantity)
59
+
60
+ result = client.transfer(
61
+ [CurrencyTransfer.to_player("TOKEN", player_id=100001, amount=25)],
62
+ idempotency_key="order-2026-09-12-0001",
63
+ )
64
+ print(result.operation_id)
65
+ ```
66
+
67
+ Асинхронный клиент имеет те же методы:
68
+
69
+ ```python
70
+ import asyncio
71
+ from atraxis import AsyncAtraxisClient
72
+
73
+
74
+ async def main() -> None:
75
+ async with AsyncAtraxisClient("agk_example.redacted") as client:
76
+ async for event in client.iter_activity():
77
+ print(event.occurred_at, event.kind, event.net)
78
+
79
+
80
+ asyncio.run(main())
81
+ ```
82
+
83
+ Токен и адрес можно передать через `ATRAXIS_API_TOKEN` и `ATRAXIS_API_BASE_URL`.
84
+ По умолчанию SDK обращается к основному серверу Atraxis. Токен не включается в `repr`,
85
+ исключения или логи самого SDK.
86
+
87
+ ## Что умеет SDK
88
+
89
+ - `get_warehouse`, `iter_warehouse` — склад гильдии;
90
+ - `list_currencies`, `upsert_currency` — внутренние валюты;
91
+ - `get_balances` — балансы игрока;
92
+ - `transfer` — единая операция из 1–10 переводов;
93
+ - `get_activity`, `iter_activity` — история операций гильдии.
94
+
95
+ Все суммы представлены в Python как `int`, а по сети передаются десятичными строками. Модели
96
+ неизменяемы. Новые необязательные поля ответа не ломают клиент, но обязательные поля всегда
97
+ проверяются.
98
+
99
+ ### Переводы
100
+
101
+ ```python
102
+ from atraxis import CurrencyTransfer, ItemTransfer
103
+
104
+ parts = [
105
+ ItemTransfer(warehouse_item_id=700001, player_id=100001, amount=1),
106
+ CurrencyTransfer.issue("TOKEN", amount=100),
107
+ CurrencyTransfer.retire("TOKEN", amount=10),
108
+ CurrencyTransfer.to_player("TOKEN", player_id=100001, amount=25),
109
+ CurrencyTransfer.from_player("TOKEN", player_id=100001, amount=5),
110
+ CurrencyTransfer.between_players(
111
+ "TOKEN",
112
+ from_player_id=100001,
113
+ to_player_id=100002,
114
+ amount=3,
115
+ ),
116
+ ]
117
+ ```
118
+
119
+ Передавайте в `idempotency_key` постоянный идентификатор перевода или заказа. Если ключ не
120
+ задан, SDK создаст UUID и вернёт его в `TransferResult.idempotency_key`. Повторный `POST` внутри
121
+ SDK использует тот же ключ.
122
+
123
+ Транспортные ошибки, `429`, `502`, `503` и `504` повторяются не более двух раз. При `429`
124
+ учитывается `Retry-After`. Ошибки API представлены `AtraxisAPIError`; в них доступны безопасный
125
+ problem response и `request_id`.
126
+
127
+ Полная интерактивная документация: <https://atraxisonline.com/developers/api>.
128
+
129
+ ## Как пополняется склад
130
+
131
+ Предметы, кредиты и Эхоны кладут на склад на странице гильдии, через основной бот
132
+ или командой `Внести …` в привязанном чате с Авророй.
133
+
134
+ Через API их можно только выдавать со склада игрокам. Списать их у игрока через API нельзя.
135
+
136
+ ## Подключение к Codex и Claude Code
137
+
138
+ ```bash
139
+ pip install "atraxis-sdk[mcp]"
140
+ ```
141
+
142
+ MCP позволяет Codex и Claude Code подсказывать по API и работать с вашей гильдией через SDK.
143
+ Без токена помощник отвечает только по документации. С `ATRAXIS_API_TOKEN` он сможет читать
144
+ данные гильдии. Команды, которые меняют валюты или передают ценности, доступны только после
145
+ запуска с `--allow-writes`; для каждого перевода потребуется `idempotency_key`.
146
+
147
+ Codex в режиме только для чтения, с уже установленной переменной окружения:
148
+
149
+ ```toml
150
+ [mcp_servers.atraxis]
151
+ command = "atraxis-mcp"
152
+ env_vars = ["ATRAXIS_API_TOKEN"]
153
+ ```
154
+
155
+ Или через CLI:
156
+
157
+ ```bash
158
+ codex mcp add atraxis --env ATRAXIS_API_TOKEN="$ATRAXIS_API_TOKEN" -- atraxis-mcp
159
+ ```
160
+
161
+ Claude Code:
162
+
163
+ ```bash
164
+ claude mcp add --transport stdio --env ATRAXIS_API_TOKEN="$ATRAXIS_API_TOKEN" atraxis -- atraxis-mcp
165
+ ```
166
+
167
+ Готовые конфигурации без токенов лежат в [`examples/mcp`](examples/mcp). Чтобы разрешить
168
+ изменения, добавьте `--allow-writes` в `args` только на своём устройстве и только для помощника,
169
+ которому доверяете.
170
+
171
+ ## Лицензия
172
+
173
+ MIT.
@@ -0,0 +1,137 @@
1
+ # Atraxis Python SDK
2
+
3
+ Официальный SDK для владельцев гильдий и лавок Atraxis. Он помогает подключить к гильдии
4
+ своего бота, сайт или учётную систему: посмотреть склад, работать с внутренними валютами,
5
+ выдавать ценности игрокам и получать историю операций.
6
+
7
+ ```bash
8
+ pip install atraxis-sdk
9
+ ```
10
+
11
+ Требуется Python 3.10 или новее. Перед началом лидер гильдии выпускает приватный токен
12
+ в разделе «Интеграции гильдии». Храните его как пароль: токен даёт доступ к операциям
13
+ вашей гильдии.
14
+
15
+ ## Быстрый старт
16
+
17
+ ```python
18
+ from atraxis import AtraxisClient, CurrencyTransfer
19
+
20
+ with AtraxisClient("agk_example.redacted") as client:
21
+ for item in client.iter_warehouse():
22
+ print(item.warehouse_item_id, item.name, item.quantity)
23
+
24
+ result = client.transfer(
25
+ [CurrencyTransfer.to_player("TOKEN", player_id=100001, amount=25)],
26
+ idempotency_key="order-2026-09-12-0001",
27
+ )
28
+ print(result.operation_id)
29
+ ```
30
+
31
+ Асинхронный клиент имеет те же методы:
32
+
33
+ ```python
34
+ import asyncio
35
+ from atraxis import AsyncAtraxisClient
36
+
37
+
38
+ async def main() -> None:
39
+ async with AsyncAtraxisClient("agk_example.redacted") as client:
40
+ async for event in client.iter_activity():
41
+ print(event.occurred_at, event.kind, event.net)
42
+
43
+
44
+ asyncio.run(main())
45
+ ```
46
+
47
+ Токен и адрес можно передать через `ATRAXIS_API_TOKEN` и `ATRAXIS_API_BASE_URL`.
48
+ По умолчанию SDK обращается к основному серверу Atraxis. Токен не включается в `repr`,
49
+ исключения или логи самого SDK.
50
+
51
+ ## Что умеет SDK
52
+
53
+ - `get_warehouse`, `iter_warehouse` — склад гильдии;
54
+ - `list_currencies`, `upsert_currency` — внутренние валюты;
55
+ - `get_balances` — балансы игрока;
56
+ - `transfer` — единая операция из 1–10 переводов;
57
+ - `get_activity`, `iter_activity` — история операций гильдии.
58
+
59
+ Все суммы представлены в Python как `int`, а по сети передаются десятичными строками. Модели
60
+ неизменяемы. Новые необязательные поля ответа не ломают клиент, но обязательные поля всегда
61
+ проверяются.
62
+
63
+ ### Переводы
64
+
65
+ ```python
66
+ from atraxis import CurrencyTransfer, ItemTransfer
67
+
68
+ parts = [
69
+ ItemTransfer(warehouse_item_id=700001, player_id=100001, amount=1),
70
+ CurrencyTransfer.issue("TOKEN", amount=100),
71
+ CurrencyTransfer.retire("TOKEN", amount=10),
72
+ CurrencyTransfer.to_player("TOKEN", player_id=100001, amount=25),
73
+ CurrencyTransfer.from_player("TOKEN", player_id=100001, amount=5),
74
+ CurrencyTransfer.between_players(
75
+ "TOKEN",
76
+ from_player_id=100001,
77
+ to_player_id=100002,
78
+ amount=3,
79
+ ),
80
+ ]
81
+ ```
82
+
83
+ Передавайте в `idempotency_key` постоянный идентификатор перевода или заказа. Если ключ не
84
+ задан, SDK создаст UUID и вернёт его в `TransferResult.idempotency_key`. Повторный `POST` внутри
85
+ SDK использует тот же ключ.
86
+
87
+ Транспортные ошибки, `429`, `502`, `503` и `504` повторяются не более двух раз. При `429`
88
+ учитывается `Retry-After`. Ошибки API представлены `AtraxisAPIError`; в них доступны безопасный
89
+ problem response и `request_id`.
90
+
91
+ Полная интерактивная документация: <https://atraxisonline.com/developers/api>.
92
+
93
+ ## Как пополняется склад
94
+
95
+ Предметы, кредиты и Эхоны кладут на склад на странице гильдии, через основной бот
96
+ или командой `Внести …` в привязанном чате с Авророй.
97
+
98
+ Через API их можно только выдавать со склада игрокам. Списать их у игрока через API нельзя.
99
+
100
+ ## Подключение к Codex и Claude Code
101
+
102
+ ```bash
103
+ pip install "atraxis-sdk[mcp]"
104
+ ```
105
+
106
+ MCP позволяет Codex и Claude Code подсказывать по API и работать с вашей гильдией через SDK.
107
+ Без токена помощник отвечает только по документации. С `ATRAXIS_API_TOKEN` он сможет читать
108
+ данные гильдии. Команды, которые меняют валюты или передают ценности, доступны только после
109
+ запуска с `--allow-writes`; для каждого перевода потребуется `idempotency_key`.
110
+
111
+ Codex в режиме только для чтения, с уже установленной переменной окружения:
112
+
113
+ ```toml
114
+ [mcp_servers.atraxis]
115
+ command = "atraxis-mcp"
116
+ env_vars = ["ATRAXIS_API_TOKEN"]
117
+ ```
118
+
119
+ Или через CLI:
120
+
121
+ ```bash
122
+ codex mcp add atraxis --env ATRAXIS_API_TOKEN="$ATRAXIS_API_TOKEN" -- atraxis-mcp
123
+ ```
124
+
125
+ Claude Code:
126
+
127
+ ```bash
128
+ claude mcp add --transport stdio --env ATRAXIS_API_TOKEN="$ATRAXIS_API_TOKEN" atraxis -- atraxis-mcp
129
+ ```
130
+
131
+ Готовые конфигурации без токенов лежат в [`examples/mcp`](examples/mcp). Чтобы разрешить
132
+ изменения, добавьте `--allow-writes` в `args` только на своём устройстве и только для помощника,
133
+ которому доверяете.
134
+
135
+ ## Лицензия
136
+
137
+ MIT.
@@ -0,0 +1,82 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.27,<2"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "atraxis-sdk"
7
+ version = "0.1.0"
8
+ description = "Official Python SDK and local MCP server for the Atraxis public API"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ authors = [{ name = "Atraxis" }]
13
+ keywords = ["atraxis", "api", "sdk", "mcp"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Programming Language :: Python :: 3",
19
+ "Programming Language :: Python :: 3 :: Only",
20
+ "Programming Language :: Python :: 3.10",
21
+ "Programming Language :: Python :: 3.11",
22
+ "Programming Language :: Python :: 3.12",
23
+ "Programming Language :: Python :: 3.13",
24
+ "Typing :: Typed",
25
+ ]
26
+ dependencies = ["httpx>=0.28,<1"]
27
+
28
+ [project.optional-dependencies]
29
+ mcp = ["mcp>=2.2,<3"]
30
+ dev = [
31
+ "build>=1.3,<2",
32
+ "hatchling>=1.27,<2",
33
+ "mcp>=2.2,<3",
34
+ "mypy>=1.15,<2",
35
+ "pytest>=8.3,<10",
36
+ "pytest-asyncio>=0.25,<2",
37
+ "PyYAML>=6,<7",
38
+ "ruff>=0.11,<1",
39
+ ]
40
+
41
+ [project.urls]
42
+ Documentation = "https://atraxisonline.com/developers/api"
43
+ Repository = "https://github.com/Atraxis/Python-SDK"
44
+ Issues = "https://github.com/Atraxis/Python-SDK/issues"
45
+
46
+ [project.scripts]
47
+ atraxis-mcp = "atraxis.mcp_server:main"
48
+
49
+ [tool.hatch.build.targets.wheel]
50
+ packages = ["src/atraxis"]
51
+
52
+ [tool.hatch.build.targets.sdist]
53
+ include = [
54
+ "/src",
55
+ "/tests",
56
+ "/scripts",
57
+ "/README.md",
58
+ "/CHANGELOG.md",
59
+ "/LICENSE",
60
+ "/pyproject.toml",
61
+ ]
62
+
63
+ [tool.hatch.build]
64
+ artifacts = ["src/atraxis/_contract/*.json", "src/atraxis/_contract/*.sha256"]
65
+
66
+ [tool.pytest.ini_options]
67
+ addopts = "-q"
68
+ asyncio_mode = "auto"
69
+ testpaths = ["tests"]
70
+
71
+ [tool.ruff]
72
+ target-version = "py310"
73
+ line-length = 100
74
+
75
+ [tool.ruff.lint]
76
+ select = ["E", "F", "I", "UP", "B", "SIM", "RUF"]
77
+
78
+ [tool.mypy]
79
+ python_version = "3.10"
80
+ strict = true
81
+ packages = ["atraxis"]
82
+