dynamitecircle 2.0.1__tar.gz → 2.3.1__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.
Files changed (30) hide show
  1. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/.gitignore +4 -0
  2. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/CHANGELOG.md +288 -5
  3. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/PKG-INFO +130 -14
  4. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/README.md +129 -13
  5. dynamitecircle-2.3.1/contracts/README.md +10 -0
  6. dynamitecircle-2.3.1/contracts/openapi.json +9103 -0
  7. dynamitecircle-2.3.1/contracts/operation-map.json +636 -0
  8. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/docs/mcp-info.md +71 -0
  9. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/docs/skill-info.md +24 -9
  10. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/manifest.json +4 -10
  11. dynamitecircle-2.3.1/py/SKILL.md +542 -0
  12. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/py/config.json +1 -1
  13. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/py/dc.py +98 -10
  14. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/py/requirements.txt +1 -1
  15. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/pyproject.toml +11 -4
  16. dynamitecircle-2.3.1/server.json +17 -0
  17. dynamitecircle-2.3.1/ts/README.md +179 -0
  18. dynamitecircle-2.3.1/ts/examples/basic.ts +14 -0
  19. dynamitecircle-2.3.1/ts/package-lock.json +33 -0
  20. dynamitecircle-2.3.1/ts/package.json +53 -0
  21. dynamitecircle-2.3.1/ts/src/client.ts +475 -0
  22. dynamitecircle-2.3.1/ts/src/errors.ts +49 -0
  23. dynamitecircle-2.3.1/ts/src/index.ts +41 -0
  24. dynamitecircle-2.3.1/ts/src/types.ts +245 -0
  25. dynamitecircle-2.3.1/ts/src/version.ts +3 -0
  26. dynamitecircle-2.3.1/ts/tests/client.test.mjs +247 -0
  27. dynamitecircle-2.3.1/ts/tsconfig.json +17 -0
  28. dynamitecircle-2.0.1/py/SKILL.md +0 -460
  29. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/LICENSE +0 -0
  30. {dynamitecircle-2.0.1 → dynamitecircle-2.3.1}/py/.env.dc.example +0 -0
@@ -13,10 +13,14 @@ __pycache__/
13
13
  .venv*
14
14
  *.egg-info/
15
15
  dist/
16
+
17
+ # MCPB bundle — built in CI (publish.yml) + attached to releases; never commit
18
+ *.mcpb
16
19
  build/
17
20
 
18
21
  # Node (in case any tool ships a sub-app)
19
22
  node_modules/
23
+ .npm-cache/
20
24
 
21
25
  # OS
22
26
  .DS_Store
@@ -3,9 +3,10 @@
3
3
  All notable changes to the **`dc` client repo** (formerly `dc-official` /
4
4
  `dc-py`) are listed here. The version
5
5
  numbers below track `DC_API_VERSION` in [`py/dc.py`](py/dc.py), which is
6
- deliberately aligned with the DC Member API server version it was last
7
- verified against. Patch bumps from the server are silent; minor or major
8
- bumps surface a one-shot stderr warning when this client falls behind.
6
+ deliberately aligned with the DC Member API contract version it was last
7
+ verified against. Python, TypeScript, and the API contract are released
8
+ together on purpose. Patch bumps from the API are silent; minor or major bumps
9
+ surface a one-shot stderr warning when an installed client falls behind.
9
10
 
10
11
  The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
11
12
  and the project follows [Semantic Versioning](https://semver.org/) for
@@ -14,6 +15,286 @@ the public Python API surface (`dc.DC`, `dc.DCError`, `dc.Result`,
14
15
 
15
16
  ---
16
17
 
18
+ ## [v2.3.1] - 2026-07-14
19
+
20
+ ### Added
21
+ - **`virtual-event-attendees`** — list the attendees (RSVP `yes`/`maybe`) of a Live Call: `dc virtual-event-attendees <sessionID> [--limit N] [--cursor TOKEN]`. Mirrors `event-attendees` — same paginated envelope, surfaces the true `total` (under `extra`) + `cursor`. TS: `client.virtualEvents.attendees(sessionID, { limit, cursor })`.
22
+
23
+ ### Changed
24
+ - Realigned `DC_API_VERSION` to the deployed Member API contract **2.3.1**. The server added the Live Call attendees endpoint plus cursor pagination and a true aggregate `total` on `GET /events/:eventID/attendees`; the pinned OpenAPI snapshot + operation-map were updated to match (no other client command changes since 2.0.4).
25
+
26
+ ## [v2.0.4] - 2026-06-16
27
+
28
+ ### Added
29
+
30
+ - list in the Official MCP Registry (b2f1d26)
31
+ - one-click install badges, VS Code docs, and .mcpb bundle (6108d51)
32
+ - MCP tool annotations and structured output (9b62eb0)
33
+ - snake_case MCP tool names and fields (f4573f8)
34
+
35
+
36
+ ## [v2.0.1] - 2026-06-16
37
+
38
+ ### Added
39
+
40
+ - v2.0.1 — formal field names (breaking) to match Member API rename (2bb90f2)
41
+
42
+
43
+ ## [v1.23.3] - 2026-06-13
44
+
45
+ ### Fixed
46
+
47
+ - dc.py help — sponsors/attendee-agenda/agendas are public (not ticket-gated) (9181cc8)
48
+
49
+
50
+ ## [v1.22.6] - 2026-06-05
51
+
52
+ ### Fixed
53
+
54
+ - explicit profile-update/calendar parsers + offline test suite (aecaca1)
55
+ - accept top-level --note on trip-create and trip-update (26a9c61)
56
+
57
+
58
+ ## [v1.22.5] - 2026-06-03
59
+
60
+ ### Fixed
61
+
62
+ - accept declared args= flags on parser-less commands (MCP bridge) (267fad2)
63
+
64
+
65
+ ## [v1.22.4] - 2026-05-27
66
+
67
+ ### Fixed
68
+
69
+ - align client with api 1.22.4 (3fe5f91)
70
+
71
+
72
+ ## [v1.22.3] - 2026-05-24
73
+
74
+ ### Added
75
+
76
+ - 6 follow commands + Follows SKILL.md section (no version bump — pending server deploy) (5f19db6)
77
+
78
+
79
+ ## [v1.20.1] - 2026-05-22
80
+
81
+ _No customer-facing changes in this release._
82
+
83
+
84
+ ## [v1.19.3] - 2026-05-21
85
+
86
+ _No customer-facing changes in this release._
87
+
88
+
89
+ ## [v1.19.2] - 2026-05-21
90
+
91
+ _No customer-facing changes in this release._
92
+
93
+
94
+ ## [v1.17.3] - 2026-05-20
95
+
96
+ _No customer-facing changes in this release._
97
+
98
+
99
+ ## [v1.17.2] - 2026-05-20
100
+
101
+ _No customer-facing changes in this release._
102
+
103
+
104
+ ## [v1.17.1] - 2026-05-20
105
+
106
+ _No customer-facing changes in this release._
107
+
108
+
109
+ ## [v1.17.0] - 2026-05-20
110
+
111
+ _No customer-facing changes in this release._
112
+
113
+
114
+ ## [v1.16.2] - 2026-05-20
115
+
116
+ _No customer-facing changes in this release._
117
+
118
+
119
+ ## [v1.14.1] - 2026-05-19
120
+
121
+ ### Added
122
+
123
+ - dc-py rooms — path-segment URLs + trim type enum (be09d76)
124
+ - dc 1.14.0 — room + room-messages; rooms enum adds direct/group (a7b8ea9)
125
+
126
+
127
+ ## [v1.13.1] - 2026-05-19
128
+
129
+ ### Fixed
130
+
131
+ - stabilize MCP stdio transport (21c8022)
132
+
133
+
134
+ ## [v1.12.5] - 2026-05-14
135
+
136
+ _No customer-facing changes in this release._
137
+
138
+
139
+ ## [v1.12.1] - 2026-05-08
140
+
141
+ _No customer-facing changes in this release._
142
+
143
+
144
+ ## [v1.11.1] - 2026-05-07
145
+
146
+ _No customer-facing changes in this release._
147
+
148
+
149
+ ## [v1.10.5] - 2026-05-07
150
+
151
+ _No customer-facing changes in this release._
152
+
153
+
154
+ ## [v1.10.4] - 2026-05-04
155
+
156
+ _No customer-facing changes in this release._
157
+
158
+
159
+ ## [v1.10.2] - 2026-05-04
160
+
161
+ _No customer-facing changes in this release._
162
+
163
+
164
+ ## [v1.9.1] - 2026-05-04
165
+
166
+ _No customer-facing changes in this release._
167
+
168
+
169
+ ## [v1.8.1] - 2026-05-04
170
+
171
+ _No customer-facing changes in this release._
172
+
173
+
174
+ ## [v1.7.1] - 2026-05-03
175
+
176
+ _No customer-facing changes in this release._
177
+
178
+
179
+ ## [v1.6.3] - 2026-05-02
180
+
181
+ ### Fixed
182
+
183
+ - rewrite CLI smoke step + bump to 1.6.3 (b098dfe)
184
+
185
+
186
+ ## [v1.6.2] - 2026-05-02
187
+
188
+ ### Added
189
+
190
+ - PyPI packaging (`dynamitecircle`) + publish workflow (77aefa4)
191
+ - add Gemini CLI pre-approval (.gemini/settings.json) (fd09acb)
192
+ - pre-approve dc MCP server + skill + CLI for Claude Code & Codex (4d234ec)
193
+ - flip canonical paths to /dc/ and /docs/, rename dc_skill.py → dc.py (42aa541)
194
+
195
+ ### Changed
196
+
197
+ - monorepo restructure — repo renamed to dc, Python client moved to /py/ (80d7166)
198
+ - SKILL_VERSION → DC_API_VERSION; deduplicate Quick start sections in README (a1e99c6)
199
+ - User-Agent → 'dc-py/<version>' (e1b5a6a)
200
+ - rename Skill base class → Runtime; SkillError → DCError; SkillResult → Result (06a2c44)
201
+ - rename public class DCSkill → DC, rename doc files (bc9d04f)
202
+
203
+ ### Fixed
204
+
205
+ - use only-include + bypass-selection so sdist ships py/ (c42abed)
206
+
207
+
208
+ ## [v1.6.1] - 2026-05-02
209
+
210
+ ### Added
211
+
212
+ - add manifest.json + LICENSE; bump to 1.6.1 (8e949d6)
213
+ - add dc/ symlink shortcut + drop hardcoded command counts (96bc6a3)
214
+
215
+
216
+ ## [v1.6.0] - 2026-04-30
217
+
218
+ _No customer-facing changes in this release._
219
+
220
+
221
+ ## [v1.5.0] - 2026-04-30
222
+
223
+ ### Added
224
+
225
+ - add announcements + event-extras commands (10 new) (f4f901f)
226
+
227
+
228
+ ## [v1.3.0] - 2026-04-30
229
+
230
+ ### Added
231
+
232
+ - add 429 retry handling and `limits` command (02bf994)
233
+
234
+
235
+ ## [v1.0.0] - 2026-04-30
236
+
237
+ _No customer-facing changes in this release._
238
+
239
+
240
+ ## [Unreleased]
241
+
242
+ ### Added
243
+
244
+ - TypeScript npm library scaffold under `ts/`, published as
245
+ `@dynamitecircle/dc`, with a hand-written SDK surface for every pinned
246
+ Member API operation. It is a library only: no CLI and no MCP server.
247
+ - Pinned OpenAPI contract under `contracts/` plus an explicit operation map
248
+ that validates API operation → Python command → TypeScript method parity.
249
+
250
+ ## [2.0.4] – 2026-06-16
251
+
252
+ ### Added
253
+
254
+ - **MCP tool annotations** — every tool now advertises `readOnlyHint` /
255
+ `destructiveHint` / `openWorldHint`, so clients can auto-approve reads and
256
+ flag writes. The read/write split is derived from each command's actual HTTP
257
+ verb and guarded by a test that re-derives it from source (no silent drift).
258
+ Write tools also carry a "⚠️ Write operation" note in their description,
259
+ mirroring the hosted MCP server.
260
+ - **Structured tool output** — object results (the list envelope
261
+ `{items, count, cursor, has_more}` and single records) are also returned as
262
+ MCP `structuredContent`, so structure-aware clients don't have to re-parse
263
+ the text. No `outputSchema` is declared (it would strictly validate every
264
+ response shape); lists/scalars remain text-only.
265
+
266
+ ### Changed
267
+
268
+ - **BREAKING (MCP interface) — tool names and fields are now snake_case.**
269
+ MCP tool names switched from kebab-case to snake_case
270
+ (`mcp__dc__trip-create` → `mcp__dc__trip_create`), and tool argument fields
271
+ likewise (`event-id` → `event_id`, `start-date` → `start_date`). This aligns
272
+ the agent-facing MCP surface with the snake_case Python library
273
+ (`dc.trip_create()`) and the prevailing MCP tool-naming convention. The
274
+ **CLI is unchanged** (`dc trip-create`, `--start-date`). Wildcard allow-rules
275
+ like `mcp__dc__*` are unaffected; any config pinning a specific kebab tool
276
+ name must update it. `_call_tool` still accepts the legacy kebab form as a
277
+ transitional fallback.
278
+
279
+ ### Docs / packaging
280
+
281
+ - Document the hosted MCP (`https://api.dynamitecircle.com/mcp`) and an
282
+ auto-updating `uvx` PyPI config; fix the `.venv/bin/python3` configs to bare
283
+ `python3`; unify `py/SKILL.md` (local client + hosted MCP) and add
284
+ `DC/SKILL.md`; add `tests/test_version_sync.py` guarding manifest/config
285
+ drift from `DC_API_VERSION`.
286
+ - **One-click install** — "Add to Cursor" and "Install in VS Code" badges for
287
+ the hosted MCP, a native VS Code section (`.vscode/mcp.json` + `code --add-mcp`),
288
+ and a `workflows`-first note for the ~80-tool surface.
289
+ - **`.mcpb` bundle** — the release workflow now builds a `dc.mcpb` (one-click
290
+ Claude Desktop install) via `mcpb pack` and attaches it to the GitHub release;
291
+ `.mcpbignore` keeps the bundle lean.
292
+ - **Official MCP Registry** — add `server.json` (`io.github.dynamitecircle/dc`,
293
+ listing the hosted streamable-HTTP endpoint) and a separate, isolated
294
+ `publish-mcp.yml` workflow that publishes it via GitHub OIDC on `v*` tags.
295
+ The registry feeds VS Code, Smithery, PulseMCP, and others. `server.json`
296
+ version is guarded by `tests/test_version_sync.py`.
297
+
17
298
  ## [2.0.1] – 2026-06-16
18
299
 
19
300
  ### Changed
@@ -227,7 +508,7 @@ cutover — were server-only with no client surface change, so no client release
227
508
 
228
509
  No client-side change required — the `hint` field on 404 payloads
229
510
  is already surfaced by `DCError`. Bump kept in lockstep with the
230
- deployed server version per the triple-lock rule.
511
+ deployed API contract version per the triple-lock rule.
231
512
 
232
513
  ---
233
514
 
@@ -1071,7 +1352,9 @@ Tag exists but no PyPI release. Replaced by 1.6.3.
1071
1352
 
1072
1353
  ---
1073
1354
 
1074
- [Unreleased]: https://github.com/dynamitecircle/dc/compare/v2.0.1...HEAD
1355
+ [Unreleased]: https://github.com/dynamitecircle/dc/compare/v2.3.1...HEAD
1356
+ [2.3.1]: https://github.com/dynamitecircle/dc/compare/v2.0.4...v2.3.1
1357
+ [2.0.4]: https://github.com/dynamitecircle/dc/compare/v2.0.1...v2.0.4
1075
1358
  [2.0.1]: https://github.com/dynamitecircle/dc/releases/tag/v2.0.1
1076
1359
  [1.23.3]: https://github.com/dynamitecircle/dc/releases/tag/v1.23.3
1077
1360
  [1.22.6]: https://github.com/dynamitecircle/dc/releases/tag/v1.22.6
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dynamitecircle
3
- Version: 2.0.1
3
+ Version: 2.3.1
4
4
  Summary: Official Python client for the public Dynamite Circle Member API. CLI, library, Agent Skill, and MCP server in one file.
5
5
  Project-URL: Homepage, https://github.com/dynamitecircle/dc
6
6
  Project-URL: Repository, https://github.com/dynamitecircle/dc
@@ -51,14 +51,18 @@ Provides-Extra: test
51
51
  Requires-Dist: pytest>=7.0; extra == 'test'
52
52
  Description-Content-Type: text/markdown
53
53
 
54
- # DC Official Client
54
+ # DC Official Clients
55
55
 
56
- The official Python client for the [Dynamite Circle Member API](https://www.dynamitecircle.com/developers/) — your own profile, trips, events, virtual events, tickets, invites, inbox, rooms, chapters, places lookup, and the weekly locator digest.
56
+ Official clients for the [Dynamite Circle Member API](https://www.dynamitecircle.com/developers/) — your own profile, trips, events, virtual events, tickets, invites, inbox, rooms, chapters, places lookup, and the weekly locator digest.
57
57
 
58
- A single self-contained file. Zero dependencies (stdlib only). Works as a CLI, a Python library, **and** a [Model Context Protocol](https://modelcontextprotocol.io) server. Compatible with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, Cursor, GitHub Copilot, and every other Agent Skills / MCP-compatible tool.
58
+ The Python client is a single self-contained file. Zero dependencies (stdlib only). Works as a CLI, a Python library, **and** a [Model Context Protocol](https://modelcontextprotocol.io) server. Compatible with Claude Code, Claude Desktop, Codex CLI, Gemini CLI, Cursor, GitHub Copilot, and every other Agent Skills / MCP-compatible tool.
59
+
60
+ The TypeScript client is an npm library for trusted server-side TypeScript projects. It is not a CLI and not an MCP server.
59
61
 
60
62
  ```
61
- py/dc.py one file, three integration modes
63
+ py/dc.py Python: CLI + library + MCP server
64
+ ts/src/ ← TypeScript: npm library
65
+ contracts/ ← pinned OpenAPI contract shared by both clients
62
66
  ```
63
67
 
64
68
  ## About the Dynamite Circle
@@ -153,6 +157,52 @@ The same `dc.py` file is shipped as **four** integrations — pick whichever fit
153
157
 
154
158
  The `mcp` package is **lazy-imported** — Agent Skill / CLI / Python-library users never need it.
155
159
 
160
+ ### TypeScript npm library
161
+
162
+ For TypeScript projects, use the package under [`ts/`](ts/):
163
+
164
+ ```ts
165
+ import { DC } from "@dynamitecircle/dc";
166
+
167
+ const dc = new DC({ apiKey: process.env.DC_API_KEY! });
168
+
169
+ const profile = await dc.profile.get();
170
+ const trips = await dc.trips.list({ limit: 10 });
171
+ ```
172
+
173
+ Keep `dk_...` API keys server-side. Do not ship a member API key in browser JavaScript.
174
+
175
+ ### Don't want to install anything? Use the hosted MCP
176
+
177
+ The DC Member API is **also a hosted MCP server** — a remote endpoint you point your AI app at, with nothing to clone, install, or update:
178
+
179
+ ```
180
+ https://api.dynamitecircle.com/mcp (Streamable HTTP)
181
+ ```
182
+
183
+ [![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=dc&config=eyJ1cmwiOiJodHRwczovL2FwaS5keW5hbWl0ZWNpcmNsZS5jb20vbWNwIn0=)
184
+ &nbsp;
185
+ [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_DC-007ACC?logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=dc&config=%7B%22url%22%3A%22https%3A%2F%2Fapi.dynamitecircle.com%2Fmcp%22%7D)
186
+
187
+ - **Claude Code:** `claude mcp add --transport http dc https://api.dynamitecircle.com/mcp`
188
+ - **Claude (web / Desktop / mobile):** Settings → Connectors → **Add custom connector** → paste the URL → **Connect**
189
+ - **VS Code:** click the badge above, or `code --add-mcp '{"name":"dc","url":"https://api.dynamitecircle.com/mcp"}'`
190
+ - **Cursor:** click the badge above, or add a custom MCP connector pointing at the URL
191
+ - **ChatGPT / any other MCP app:** add a custom / remote MCP connector pointing at the URL above
192
+
193
+ When prompted, **sign in with your DC account** (one-click OAuth) — or send a `dk_` key as `Authorization: Bearer`. The server is always on the current API version, so there's nothing to keep up to date.
194
+
195
+ **Hosted MCP vs. this client — which do I want?**
196
+
197
+ | You want… | Use |
198
+ |---|---|
199
+ | Zero install, always-current, just MCP tools in a chat app | **Hosted MCP** (URL above) |
200
+ | To call DC from your own Python code (`from dynamitecircle import DC`) | **This client** (library) |
201
+ | A local CLI (`dc profile`) or shell scripting | **This client** (CLI) |
202
+ | A local stdio MCP server (offline-capable, pin a version, dev against localhost) | **This client** (`dc --mcp`) |
203
+
204
+ The rest of this README is about **this client**. For the hosted MCP, the URL above is all you need.
205
+
156
206
  ## Features
157
207
 
158
208
  - **Full Member API coverage** — read + write across every public endpoint (run `python3 py/dc.py help` for the live list)
@@ -214,7 +264,18 @@ Run `python3 py/dc.py help` for the full command list.
214
264
 
215
265
  ## Setup per AI tool
216
266
 
217
- ### Claude Code
267
+ ### Hosted MCP (no install, always current)
268
+
269
+ Nothing to clone or update — point your tool at the remote endpoint:
270
+
271
+ ```bash
272
+ # Claude Code
273
+ claude mcp add --transport http dc https://api.dynamitecircle.com/mcp
274
+ ```
275
+
276
+ For Claude web / Desktop, Cursor, ChatGPT, and other MCP apps, add a **custom / remote connector** pointing at `https://api.dynamitecircle.com/mcp` (Streamable HTTP). Sign in with your DC account (OAuth) or send a `dk_` key as a Bearer header. Discovery is published at [`/.well-known/mcp.json`](https://api.dynamitecircle.com/.well-known/mcp.json). This is the lowest-effort path; everything below runs the client **locally** instead.
277
+
278
+ ### Claude Code (local client)
218
279
 
219
280
  `.mcp.json` is already shipped with this repo. Open the repo with `claude`:
220
281
 
@@ -231,9 +292,30 @@ pip install -r py/requirements.txt
231
292
 
232
293
  Skill discovery (CLI + import) works automatically via `py/SKILL.md`.
233
294
 
295
+ #### Auto-updating local MCP via `uvx` (PyPI)
296
+
297
+ Prefer a local stdio server that **pulls the latest published client on every launch** with no clone to maintain? Use [`uv`](https://docs.astral.sh/uv/)'s `uvx` and pass your key in the `env` block:
298
+
299
+ ```json
300
+ {
301
+ "mcpServers": {
302
+ "dc": {
303
+ "type": "stdio",
304
+ "command": "uvx",
305
+ "args": ["--refresh", "--from", "dynamitecircle[mcp]", "dc", "--mcp"],
306
+ "env": { "DC_API_KEY": "dk_<api-key>" }
307
+ }
308
+ }
309
+ }
310
+ ```
311
+
312
+ Notes: the console script is `dc` (not `dynamitecircle`), so `--from dynamitecircle[mcp]` is required — it both names the package and pulls the optional `mcp` extra. `--refresh` is what makes it auto-update; drop it to let `uvx` cache. The `DC_API_KEY` in `env` wins over any `.env.dc` (an ephemeral `uvx` install has none).
313
+
234
314
  ### Claude Desktop
235
315
 
236
- Edit your config file:
316
+ **Easiest — one-click `.mcpb`:** download `dc.mcpb` from the [latest GitHub release](https://github.com/dynamitecircle/dc/releases/latest) and double-click it. Claude Desktop installs the `dc` server and prompts for your `DC_API_KEY` (no JSON editing). Requires Python 3.9+ with the `mcp` package available on your machine (`pip install 'dynamitecircle[mcp]'`). *(Or skip local install entirely and use the [hosted MCP connector](#hosted-mcp-no-install-always-current) above.)*
317
+
318
+ **Manual** — edit your config file:
237
319
 
238
320
  - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
239
321
  - Linux: `~/.config/Claude/claude_desktop_config.json`
@@ -330,9 +412,19 @@ Non-paginated extras (e.g. `totalUnread` on `inbox`) are passed through under an
330
412
 
331
413
  ## Use as a Python library
332
414
 
415
+ Installed from PyPI (`pip install dynamitecircle`) — import by the package name:
416
+
417
+ ```python
418
+ from dynamitecircle import DC
419
+
420
+ dc = DC()
421
+ ```
422
+
423
+ Working from a clone instead? Point `sys.path` at the `py/` folder and import as `dc`:
424
+
333
425
  ```python
334
426
  import sys
335
- sys.path.insert(0, "dc")
427
+ sys.path.insert(0, "py")
336
428
  from dc import DC
337
429
 
338
430
  dc = DC()
@@ -364,10 +456,23 @@ The full live reference for the DC Member API — every endpoint, parameter, and
364
456
 
365
457
  ## Staying up to date
366
458
 
367
- The DC Member API ships new endpoints and refinements regularly. This skill is the official client and we update it whenever the API changes. **Plan for updates** — the skill will warn you on stderr the first time a request returns a server `X-API-Version` newer than `DC_API_VERSION`, and major-version bumps may break older clients.
459
+ The DC Member API ships new endpoints and refinements regularly. This skill is the official client and we update it whenever the API changes. **Plan for updates** — the skill will warn you on stderr the first time a request returns an `X-API-Version` newer than `DC_API_VERSION`, and major-version bumps may break older clients.
460
+
461
+ **The no-maintenance option:** if you use the [hosted MCP](#hosted-mcp-no-install-always-current) (`https://api.dynamitecircle.com/mcp`), there's nothing to update — the server always runs the current API version. The strategies below apply only to the **local client**.
368
462
 
369
463
  Pick whichever integration style fits your project. From simplest to most isolated:
370
464
 
465
+ ### 0. PyPI — `pip` / `uvx`
466
+
467
+ ```bash
468
+ pip install dynamitecircle # CLI + library
469
+ pip install 'dynamitecircle[mcp]' # + local MCP server (dc --mcp)
470
+ ```
471
+
472
+ Then `dc setup --api-key dk_<api-key>` and `dc self-test`. Update with `pip install --upgrade dynamitecircle`. For a local MCP that auto-updates on every launch, use the [`uvx` config above](#auto-updating-local-mcp-via-uvx-pypi).
473
+
474
+ Best for: the quickest local install, and the auto-updating `uvx` MCP setup.
475
+
371
476
  ### 1. Plain git clone — quick local use
372
477
 
373
478
  ```bash
@@ -458,7 +563,7 @@ Best for: CI environments, ephemeral containers, scripted setups.
458
563
 
459
564
  - **Stay current.** The DC Member API ships new endpoints regularly and the client mirrors them; running stale means missing features and (eventually) compatibility warnings on stderr.
460
565
  - **Run `self-test` after every update.** Five seconds, catches breakage.
461
- - **Watch stderr the first time you call any command after updating.** The version-mismatch warning prints once per process when the server is on a newer minor/major.
566
+ - **Watch stderr the first time you call any command after updating.** The version-mismatch warning prints once per process when the API is on a newer minor/major.
462
567
  - **Major version bumps may be backwards-incompatible.** Read the release notes on the GitHub repo before pulling across a major boundary.
463
568
 
464
569
  ## Rate limits
@@ -504,7 +609,19 @@ dc/
504
609
  │ ├── .env.dc.example # template
505
610
  │ └── .env.dc # gitignored (created by `setup`)
506
611
 
507
- │ (Future: go/, node/, rs/ folders for sister clients in other languages)
612
+ ├── ts/ # TypeScript npm library (@dynamitecircle/dc)
613
+ │ ├── src/ # hand-written SDK surface
614
+ │ ├── tests/ # contract + request behavior tests
615
+ │ ├── examples/ # TypeScript usage examples
616
+ │ ├── package.json
617
+ │ └── tsconfig.json
618
+
619
+ ├── contracts/ # pinned API contract shared by clients
620
+ │ ├── openapi.json # committed snapshot of /openapi.json
621
+ │ └── operation-map.json # OpenAPI op → Python command → TS method
622
+
623
+ ├── DC/
624
+ │ └── SKILL.md → ../py/SKILL.md # human-friendly skill path (symlink)
508
625
 
509
626
  ├── docs/ # ← REAL design docs (canonical)
510
627
  │ ├── skill-info.md # design rules / architecture
@@ -527,9 +644,9 @@ dc/
527
644
 
528
645
  ### About the layout
529
646
 
530
- This is a **monorepo**. The Python client lives at `/py/` so we can add future sister clients (`go/`, `node/`, `rs/`) at the same level they all wrap the same DC Member API. `/docs/` is shared. The dotfile-prefixed directories (`.claude/`, `.agents/`, `.gemini/`) exist because AI tools auto-discover skills from those specific paths — they're kept hidden but each one **symlinks (or points) straight to the canonical folder**, so you only edit files in one place. Edit `py/dc.py` and Claude Code, Codex, and Gemini CLI all see the same file via their respective discovery directories. Gemini CLI also reads `.agents/skills/` as an alias, so we don't need a redundant `.gemini/skills/` symlink.
647
+ This is a **monorepo**. The Python client lives at `/py/`; the TypeScript client lives at `/ts/`. Both wrap the same DC Member API and are validated against the pinned contract in `/contracts/`. `/docs/` is shared. The dotfile-prefixed directories (`.claude/`, `.agents/`, `.gemini/`) exist because AI tools auto-discover skills from those specific paths — they're kept hidden but each one **symlinks (or points) straight to the canonical folder**, so you only edit files in one place. Edit `py/dc.py` and Claude Code, Codex, and Gemini CLI all see the same file via their respective discovery directories. Gemini CLI also reads `.agents/skills/` as an alias, so we don't need a redundant `.gemini/skills/` symlink.
531
648
 
532
- If you're adding new code or docs, edit `py/` (or `docs/`) directly. The discovery folders take care of themselves.
649
+ If you're adding Python code or skill docs, edit `py/` (or `docs/`) directly. If you're adding TypeScript library code, edit `ts/`. The discovery folders take care of themselves.
533
650
 
534
651
  ### Pre-approval out of the box
535
652
 
@@ -542,4 +659,3 @@ This repo is maintained by the Dynamite Circle team. It's read-only for the publ
542
659
  ## License
543
660
 
544
661
  [MIT](LICENSE) — see the LICENSE file for the full text.
545
-