{
  "markdown": "# DC Official Clients\n\nOfficial 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.\n\nThe 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.\n\nThe TypeScript client is an npm library for trusted server-side TypeScript projects. It is not a CLI and not an MCP server.\n\n```\npy/dc.py       ← Python: CLI + library + MCP server\nts/src/        ← TypeScript: npm library\ncontracts/     ← pinned OpenAPI contract shared by both clients\n```\n\n## About the Dynamite Circle\n\nThe [Dynamite Circle](https://www.dynamitecircle.com/?utm_medium=github&utm_source=dc-official&utm_campaign=client-repo) is **the place where global founders find their people** — a curated, members-only community of location-independent business owners running profitable companies around the world. Founded in 2011 (it started with twenty listeners on a remote tropical island), the DC has grown into a hand-selected network of ~1,500 active founders who meet at vetted in-person events like [DCBKK](https://www.dynamitecircle.com/dcbkk/) and DCMEX, swap notes in private rooms, and travel through each other's home cities year-round.\n\nDC is a private community, but it's open to applications from founders running location-independent businesses doing $100k+ in annual revenue. Every application is personally reviewed by a team member within 48 business hours — [start an application here](https://dc.dynamitecircle.com/account/apply?utm_medium=github&utm_source=dc-official&utm_campaign=client-repo&referrer=github.com) if that sounds like you.\n\n## Quick Start\n\nNever used Claude Code, Codex, or git? Here's the 5-minute path from zero to \"Claude can read my DC profile.\"\n\n### 1. Install the basics (one-time)\n\nYou need three free things on your computer:\n\n- **Python 3.9+** — the language this client is written in. [Download here](https://www.python.org/downloads/) (Mac/Windows/Linux installers; check **\"Add Python to PATH\"** on Windows).\n- **Git** — the tool that downloads code from GitHub. [Download here](https://git-scm.com/downloads).\n- **An AI assistant** — pick one:\n  - **[Claude Code](https://claude.com/product/claude-code)** ← *recommended* — this repo is built around it\n  - **[Codex CLI](https://github.com/openai/codex)** — works too, slightly different commands\n  - **[Claude Desktop](https://claude.ai/download)** — the chat app, gets you the MCP server but no CLI\n\nIf anything during install asks \"do you want to add to PATH?\" — say yes.\n\n### 2. Get the code\n\nOpen a terminal:\n- **Mac**: Spotlight → \"Terminal\"\n- **Windows**: Start → \"Terminal\" (or \"PowerShell\")\n- **Linux**: you know what to do\n\nThen paste:\n\n```bash\ngit clone https://github.com/dynamitecircle/dc.git\ncd dc\n```\n\nYou now have a folder called `dc` with all the code in it.\n\n### 3. Get your DC API key\n\nIn your browser: go to **https://dc.dynamitecircle.com**, log in, click your profile photo (top-right), and choose **DC Member API Key**. Copy the long string starting with `dk_…`.\n\n### 4. Tell the client about your key\n\nBack in your terminal (still inside the `dc` folder):\n\n```bash\npython3 py/dc.py setup --api-key dk_paste_your_key_here\n```\n\n### 5. Try it\n\nOpen **Claude Code** and make sure it's pointed at the `dc` folder you just downloaded. (Claude usually opens to your last project — if it's somewhere else, click the folder icon and pick `dc`.)\n\nThen ask:\n\n> \"Show me my DC profile\"\n\nClaude runs the right command and shows you back your profile. A few more to try:\n\n> \"What's the latest in DC announcements?\"\n> \"What events am I attending?\"\n> \"Show me the DCMEX schedule and bookmark anything about marketing\"\n> \"Who else from my chapter is going to DCBKK?\"\n\nYou're done. The rest of this README explains what's possible in more detail; [`py/SKILL.md`](py/SKILL.md) lists every command Claude can run.\n\n### If something didn't work\n\n| Symptom | What to try |\n|---|---|\n| `python3: command not found` | Python didn't install or didn't get added to PATH. Re-install and check the **\"Add to PATH\"** box on Windows; on Mac, try `python` instead of `python3`. |\n| `git: command not found` | Same idea — re-install Git. |\n| Claude says \"I don't see a `dc` skill\" | Make sure Claude Code is opened to the `dc` folder, not your home directory or another project. Or just ask Claude: *\"are you in the dc folder?\"* |\n| Anything else | Run `python3 py/dc.py self-test` from the `dc` folder — it tells you exactly which step is broken. |\n\n---\n\n## How it's exposed\n\nThe same `dc.py` file is shipped as **four** integrations — pick whichever fits how your tool talks to it:\n\n| Integration | What it is | Invoke with | Dependencies |\n|---|---|---|---|\n| **Agent Skill** | Auto-discovered via `SKILL.md` frontmatter (Claude Code, Codex, Gemini CLI, Cursor, Copilot) | Just open the repo with the tool — it reads [`py/SKILL.md`](py/SKILL.md) and offers the commands | stdlib only |\n| **CLI** | Run commands directly from the shell or scripts | `python3 py/dc.py <command>` | stdlib only |\n| **Python library** | Import in your own Python code | `from dc import DC; DC().profile()` | stdlib only |\n| **MCP server** | Speaks Model Context Protocol over stdio (Claude Desktop, Cursor, Codex MCP, Cline, etc.) | `python3 py/dc.py --mcp` | `pip install mcp` (optional) |\n\nThe `mcp` package is **lazy-imported** — Agent Skill / CLI / Python-library users never need it.\n\n### TypeScript npm library\n\nFor TypeScript projects, use the package under [`ts/`](ts/):\n\n```ts\nimport { DC } from \"@dynamitecircle/dc\";\n\nconst dc = new DC({ apiKey: process.env.DC_API_KEY! });\n\nconst profile = await dc.profile.get();\nconst trips = await dc.trips.list({ limit: 10 });\n```\n\nKeep `dk_...` API keys server-side. Do not ship a member API key in browser JavaScript.\n\n### Don't want to install anything? Use the hosted MCP\n\nThe 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:\n\n```\nhttps://api.dynamitecircle.com/mcp        (Streamable HTTP)\n```\n\n[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](cursor://anysphere.cursor-deeplink/mcp/install?name=dc&config=eyJ1cmwiOiJodHRwczovL2FwaS5keW5hbWl0ZWNpcmNsZS5jb20vbWNwIn0=)\n&nbsp;\n[![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)\n\n- **Claude Code:** `claude mcp add --transport http dc https://api.dynamitecircle.com/mcp`\n- **Claude (web / Desktop / mobile):** Settings → Connectors → **Add custom connector** → paste the URL → **Connect**\n- **VS Code:** click the badge above, or `code --add-mcp '{\"name\":\"dc\",\"url\":\"https://api.dynamitecircle.com/mcp\"}'`\n- **Cursor:** click the badge above, or add a custom MCP connector pointing at the URL\n- **ChatGPT / any other MCP app:** add a custom / remote MCP connector pointing at the URL above\n\nWhen 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.\n\n**Hosted MCP vs. this client — which do I want?**\n\n| You want… | Use |\n|---|---|\n| Zero install, always-current, just MCP tools in a chat app | **Hosted MCP** (URL above) |\n| To call DC from your own Python code (`from dynamitecircle import DC`) | **This client** (library) |\n| A local CLI (`dc profile`) or shell scripting | **This client** (CLI) |\n| A local stdio MCP server (offline-capable, pin a version, dev against localhost) | **This client** (`dc --mcp`) |\n\nThe rest of this README is about **this client**. For the hosted MCP, the URL above is all you need.\n\n## Features\n\n- **Full Member API coverage** — read + write across every public endpoint (run `python3 py/dc.py help` for the live list)\n- **Setup command** — saves your API key to a chmod-600 `.env.dc` next to the skill\n- **Self-test command** — validates env, network, key shape, and a live `/profile` call end-to-end\n- **Cursor pagination** — every list-returning command uses the same `[--limit N] [--cursor TOKEN]` shape and returns the canonical envelope `{items, count, cursor, has_more}`\n- **Three output formats** — text (default, pretty JSON), `--json`, `--python`\n- **MCP-ready** — same skill auto-exposes all commands as MCP tools\n- **Pre-configured for Claude Code** — repo ships an `.mcp.json`, just `cd` and `claude`\n\n## CLI quickstart (already comfortable in a terminal?)\n\nIf you're skipping past the [Quick Start](#quick-start) above and just want the CLI flow, here's the condensed version.\n\n### 1. Get an API key\n\nDC profile dropdown → **DC Member API Key** (admins/testers only). Keys look like `dk_<api-key>` and are revocable from the same dropdown.\n\n### 2. Save the key\n\n```bash\npython3 py/dc.py setup --api-key dk_<api-key>\n```\n\nThis writes `py/.env.dc` (chmod 600, gitignored).\n\n### 3. Verify the connection\n\n```bash\npython3 py/dc.py self-test\n```\n\nExpected output:\n\n```json\n{\n  \"ok\": true,\n  \"userID\": \"<your-id>\",\n  \"displayName\": \"<Your Name>\",\n  \"checks\": [\n    { \"step\": \"env\",      \"ok\": true, \"message\": \"DC_API_KEY loaded from ...\" },\n    { \"step\": \"keyShape\", \"ok\": true, \"message\": \"Key prefix valid (expected userID: <id>)\" },\n    { \"step\": \"profile\",  \"ok\": true, \"message\": \"connected as userID[<id>] <Your Name>\" }\n  ]\n}\n```\n\n### 4. Try a few commands\n\n```bash\npython3 py/dc.py profile\npython3 py/dc.py trips --limit 5\npython3 py/dc.py events --past --limit 3\npython3 py/dc.py chapters --limit 5\npython3 py/dc.py permacode\n```\n\nRun `python3 py/dc.py help` for the full command list.\n\n## Setup per AI tool\n\n### Hosted MCP (no install, always current)\n\nNothing to clone or update — point your tool at the remote endpoint:\n\n```bash\n# Claude Code\nclaude mcp add --transport http dc https://api.dynamitecircle.com/mcp\n```\n\nFor 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.\n\n### Claude Code (local client)\n\n`.mcp.json` is already shipped with this repo. Open the repo with `claude`:\n\n```bash\ncd dc\nclaude\n```\n\nTools become available as `mcp__dc__*`. First-time install of the optional MCP dependency:\n\n```bash\npip install -r py/requirements.txt\n```\n\nSkill discovery (CLI + import) works automatically via `py/SKILL.md`.\n\n#### Auto-updating local MCP via `uvx` (PyPI)\n\nPrefer 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:\n\n```json\n{\n  \"mcpServers\": {\n    \"dc\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"--refresh\", \"--from\", \"dynamitecircle[mcp]\", \"dc\", \"--mcp\"],\n      \"env\": { \"DC_API_KEY\": \"dk_<api-key>\" }\n    }\n  }\n}\n```\n\nNotes: 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).\n\n### Claude Desktop\n\n**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.)*\n\n**Manual** — edit your config file:\n\n- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- Linux: `~/.config/Claude/claude_desktop_config.json`\n- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"dc\": {\n      \"command\": \"python3\",\n      \"args\": [\"/absolute/path/to/dc/py/dc.py\", \"--mcp\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop.\n\n### Codex CLI\n\nEdit `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.dc]\ncommand = \"python3\"\nargs = [\"/absolute/path/to/dc/py/dc.py\", \"--mcp\"]\n```\n\nCodex auto-discovers `AGENTS.md` (symlinked to `CLAUDE.md`) and `.agents/skills/` (symlinked to `.claude/skills/`).\n\n### Gemini CLI\n\nReads `GEMINI.md` (symlinked to `CLAUDE.md`) for context. For MCP, configure in your Gemini CLI settings:\n\n```yaml\nmcp_servers:\n  dc:\n    command: python3\n    args:\n      - /absolute/path/to/dc/py/dc.py\n      - --mcp\n```\n\n### Cursor\n\nSettings → MCP → Add server, then point at the same `dc.py --mcp`.\n\n### GitHub Copilot\n\nReads `.github/copilot-instructions.md` for context. Copilot doesn't have native MCP support yet — use it for in-editor suggestions while developing.\n\n### Any other MCP client\n\nSame recipe: command = `python3`, args = `[\"/path/to/dc.py\", \"--mcp\"]`. The protocol is standard.\n\n## Output formats\n\n```bash\npython3 dc.py profile             # text (pretty JSON for dicts/lists)\npython3 dc.py profile --json      # explicit JSON\npython3 dc.py profile --python    # Python repr (eval-safe)\n```\n\nGlobal flags work before or after the command name:\n\n```bash\npython3 dc.py --json profile\npython3 dc.py profile --json\n```\n\n## Cursor pagination\n\nAll list-returning commands take the same flags:\n\n```bash\npython3 dc.py trips\npython3 dc.py trips --limit 10\npython3 dc.py trips --limit 10 --cursor <opaque-token-from-previous-response>\npython3 dc.py trips --past --limit 5\n```\n\nStandard envelope:\n\n```json\n{\n  \"items\":    [ /* page of records */ ],\n  \"count\":    42,\n  \"cursor\":   \"opaque-token-or-null\",\n  \"has_more\": true\n}\n```\n\nNon-paginated extras (e.g. `totalUnread` on `inbox`) are passed through under an `extra` key.\n\n## Use as a Python library\n\nInstalled from PyPI (`pip install dynamitecircle`) — import by the package name:\n\n```python\nfrom dynamitecircle import DC\n\ndc = DC()\n```\n\nWorking from a clone instead? Point `sys.path` at the `py/` folder and import as `dc`:\n\n```python\nimport sys\nsys.path.insert(0, \"py\")\nfrom dc import DC\n\ndc = DC()\n\n# Reads\nprofile  = dc.profile()\ntrips    = dc.trips(past=True, limit=10)\nevents   = dc.events(past=True, limit=5)\nchapters = dc.chapters()\noverlaps = dc.overlaps()\nlocator  = dc.locator(sections=\"homeCity,favoriteCities\")\n\n# Writes\ndc.profile_update({\"headline\": \"CEO at Acme\"})\ndc.trip_create(start_date=\"2026-12-01\", end_date=\"2026-12-05\", place_id=\"ChIJ...\")\ndc.event_rsvp(\"<eventID>\", \"yes\")\ndc.invite_create(email=\"new@friend.com\", full_name=\"New Friend\")\n```\n\nOverride the API URL (e.g. for a local dev server):\n\n```python\ndc = DC(api_url=\"http://localhost:8080\")\n```\n\n## API reference\n\nThe full live reference for the DC Member API — every endpoint, parameter, and response shape — is at **https://www.dynamitecircle.com/developers/**. The page is regenerated on every deploy, so it's always current.\n\n## Staying up to date\n\nThe 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.\n\n**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**.\n\nPick whichever integration style fits your project. From simplest to most isolated:\n\n### 0. PyPI — `pip` / `uvx`\n\n```bash\npip install dynamitecircle              # CLI + library\npip install 'dynamitecircle[mcp]'       # + local MCP server (dc --mcp)\n```\n\nThen `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).\n\nBest for: the quickest local install, and the auto-updating `uvx` MCP setup.\n\n### 1. Plain git clone — quick local use\n\n```bash\ngit clone https://github.com/dynamitecircle/dc.git\ncd dc\npython3 py/dc.py setup --api-key dk_<api-key>\n```\n\nTo update: `cd dc && git pull`. Run `self-test` afterwards.\n\nBest for: trying things out, scripts you run by hand, no other repo involved.\n\n### 2. Git submodule — pinned to a specific commit\n\nIf you have your own project repo and want the `dc` repo versioned alongside it:\n\n```bash\ncd your-project\ngit submodule add https://github.com/dynamitecircle/dc.git vendor/dc\ngit commit -m \"Add dc client as submodule\"\n```\n\nTo update later:\n\n```bash\ncd vendor/dc\ngit pull origin main\ncd ../..\ngit add vendor/dc\ngit commit -m \"Bump dc client\"\n```\n\nThen in your code:\n\n```python\nimport sys\nsys.path.insert(0, \"vendor/dc/py\")\nfrom dc import DC\n```\n\nBest for: production-ish code where you want explicit, reviewable bumps.\n\n### 3. Git subtree — same updates, no submodule indirection\n\n```bash\ncd your-project\ngit subtree add --prefix vendor/dc \\\n  https://github.com/dynamitecircle/dc.git main --squash\n```\n\nUpdate with:\n\n```bash\ngit subtree pull --prefix vendor/dc \\\n  https://github.com/dynamitecircle/dc.git main --squash\n```\n\nBest for: teammates who don't know submodules — files just appear in your repo.\n\n### 4. Symlink — share one clone across many projects\n\nIf you keep all your projects in `~/code/`:\n\n```bash\ngit clone https://github.com/dynamitecircle/dc.git ~/code/dc\n\n# In each project that uses it:\ncd ~/code/your-project\nln -s ../dc vendor/dc\n```\n\nNow `cd ~/code/dc && git pull` updates every consumer at once. Project-level `.mcp.json` / `.codex/config.toml` entries can use `vendor/dc/py/dc.py` and they'll resolve through the symlink.\n\nBest for: power users with multiple personal projects and one machine.\n\n### 5. Pip-installable Git ref — one-shot for a virtualenv\n\nThe skill is one file with no setup.py, but you can install the package the MCP server needs and check the file out as a sibling:\n\n```bash\npip install mcp\ngit clone https://github.com/dynamitecircle/dc.git\n```\n\nBest for: CI environments, ephemeral containers, scripted setups.\n\n### Update etiquette\n\n- **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.\n- **Run `self-test` after every update.** Five seconds, catches breakage.\n- **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.\n- **Major version bumps may be backwards-incompatible.** Read the release notes on the GitHub repo before pulling across a major boundary.\n\n## Rate limits\n\n| Tier              | Per minute | Per day |\n|-------------------|------------|---------|\n| DC Community      | 10         | 300     |\n| DC BLACK          | 60         | 3,000   |\n\nHeaders on every response: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, `X-RateLimit-Daily-Remaining`.\n\n## Platform support\n\nTested on macOS, Linux, and Windows 10/11. Python 3.9+ required (uses `pathlib`, `Path.replace`, `inspect.signature`, `contextvars`, `urllib`).\n\n### Windows notes\n\n- The skill auto-reconfigures `stdout` and `stderr` to UTF-8 at startup, so emoji and em-dashes render correctly even on legacy `cmd.exe` (which defaults to cp1252). If you still see mojibake on a very old terminal, set `PYTHONIOENCODING=utf-8` once: `setx PYTHONIOENCODING utf-8` then restart your shell.\n- `setup` writes `.env.dc` and tries to chmod 600 it. On Windows this is a no-op — the file inherits NTFS perms from its parent. The skill emits a one-time note about this when you run `setup`. Make sure your repo isn't on a shared drive.\n- Use `python` or `python3.exe` to invoke; the `#!/usr/bin/env python3` shebang is ignored on Windows.\n\n## Project layout\n\n```\ndc/\n├── README.md                          # this file\n├── CLAUDE.md                          # AI-tool guide (also linked as AGENTS.md, GEMINI.md)\n├── AGENTS.md       → CLAUDE.md        # symlink (Codex)\n├── GEMINI.md       → CLAUDE.md        # symlink (Gemini)\n├── LICENSE                            # MIT\n├── manifest.json                      # MCPB manifest (MCP 2025-11 spec)\n├── .mcp.json                          # auto-registers `dc` MCP server in Claude Code\n├── .codex/\n│   └── config.toml                    # auto-registers `dc` for Codex CLI\n├── .github/\n│   └── copilot-instructions.md        # GitHub Copilot\n│\n├── py/                                # ← Python client (canonical)\n│   ├── SKILL.md                       # Agent Skills frontmatter + usage\n│   ├── config.json                    # name, version, env requirements\n│   ├── dc.py                          # CLI + Python import + --mcp server\n│   ├── requirements.txt               # optional MCP dep — skip for CLI/import\n│   ├── .env.dc.example                # template\n│   └── .env.dc                        # gitignored (created by `setup`)\n│\n├── ts/                                # ← TypeScript npm library (@dynamitecircle/dc)\n│   ├── src/                           # hand-written SDK surface\n│   ├── tests/                         # contract + request behavior tests\n│   ├── examples/                      # TypeScript usage examples\n│   ├── package.json\n│   └── tsconfig.json\n│\n├── contracts/                         # pinned API contract shared by clients\n│   ├── openapi.json                   # committed snapshot of /openapi.json\n│   └── operation-map.json             # OpenAPI op → Python command → TS method\n│\n├── DC/\n│   └── SKILL.md     → ../py/SKILL.md  # human-friendly skill path (symlink)\n│\n├── docs/                              # ← REAL design docs (canonical)\n│   ├── skill-info.md                # design rules / architecture\n│   └── mcp-info.md                    # MCP setup for every supported client\n│\n├── .claude/                           # Agent Skills discovery (Claude Code)\n│   ├── skills/dc  → ../../py          # symlink to canonical Python client\n│   └── docs       → ../docs           # symlink to canonical docs\n│\n├── .agents/                           # Agent Skills discovery (Codex CLI + Gemini CLI alias)\n│   ├── skills/dc  → ../../py          # symlink to canonical Python client\n│   └── docs       → ../docs           # symlink to canonical docs\n│\n├── .gemini/                           # Gemini CLI MCP config\n│   └── settings.json                  # auto-approves dc MCP tools (trust: true)\n│\n├── .gitignore\n└── .gitattributes\n```\n\n### About the layout\n\nThis 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.\n\nIf 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.\n\n### Pre-approval out of the box\n\n`.claude/settings.json`, `.codex/config.toml`, and `.gemini/settings.json` all auto-approve the `dc` MCP server's tools so users don't get a per-call approval prompt when they open this repo with their AI tool. Anyone uncomfortable with that can override with their personal `.claude/settings.local.json`, `~/.codex/config.toml`, or `~/.gemini/settings.json`. Every dc write tool is scoped to the caller's own DC account via their personal API key — pre-approval doesn't widen any blast radius, just removes per-call friction.\n\n## Maintenance\n\nThis repo is maintained by the Dynamite Circle team. It's read-only for the public — clone it and use it, but don't open PRs. If you spot a bug or want a new feature, contact us through the official DC channels.\n\n## License\n\n[MIT](LICENSE) — see the LICENSE file for the full text.\n",
  "bytes": 25136,
  "sha": "8b6267ea2826fc46005dbd06b70a3175dc933b7dc7e0caf84799336f14971945",
  "repo_slug": "dynamitecircle/dc",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_dynamitecircle_dc_b4f89163/readme"
}