engineering-board-mcp 1.7.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,233 @@
1
+ Metadata-Version: 2.4
2
+ Name: engineering-board-mcp
3
+ Version: 1.7.0
4
+ Summary: Zero-dependency MCP server for engineering-board: a git-committed kanban board your AI agents run and remember.
5
+ Author: Acadia
6
+ License: MIT
7
+ Project-URL: Homepage, https://ghostlygawd.github.io/engineering-board/
8
+ Project-URL: Repository, https://github.com/GhostlyGawd/engineering-board
9
+ Project-URL: Documentation, https://github.com/GhostlyGawd/engineering-board/blob/main/mcp-server/README.md
10
+ Project-URL: Changelog, https://github.com/GhostlyGawd/engineering-board/blob/main/CHANGELOG.md
11
+ Keywords: mcp,mcp-server,kanban,multi-agent,agentic-workflow,claude-code
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Topic :: Software Development
18
+ Requires-Python: >=3.8
19
+ Description-Content-Type: text/markdown
20
+
21
+ # engineering-board MCP server
22
+
23
+ A zero-dependency [Model Context Protocol](https://modelcontextprotocol.io) server
24
+ that exposes the `engineering-board` plugin's markdown board as MCP tools. It lets
25
+ any MCP client (Claude Code, Claude Desktop, …) scaffold boards, create/list/update
26
+ entries, rebuild the index, capture scratch findings, and claim/release entry locks —
27
+ all against the exact on-disk format the plugin's hooks and skills expect.
28
+
29
+ ## Design constraints
30
+
31
+ - **Pure `python3`, zero third-party dependencies.** No `mcp` pip SDK, no `pydantic`.
32
+ The MCP stdio/JSON-RPC protocol is implemented directly, so the server runs under
33
+ the same `bash` + `python3` + coreutils toolchain as the rest of the plugin (CI has
34
+ no install step).
35
+ - **Transport:** stdio, JSON-RPC 2.0, newline-delimited messages, protocolVersion
36
+ `2025-06-18`. Only JSON-RPC messages go to stdout; diagnostics go to stderr.
37
+ - Locking is **not reimplemented** — `board_claim` / `board_release` shell out to the
38
+ plugin's existing `hooks/scripts/board-claim-acquire.sh` / `board-claim-release.sh`.
39
+ - Timestamps are real UTC ISO-8601 (second precision) via `datetime.now(timezone.utc)`.
40
+
41
+ The board location for a `project` is resolved via `engineering-board/BOARD-ROUTER.md`
42
+ (then the pre-1.1.0 `docs/boards/BOARD-ROUTER.md` compat path), falling back to
43
+ `engineering-board/<project>/`. The repo root defaults to `$CLAUDE_PROJECT_DIR`, then
44
+ the current working directory, and can be overridden per-call with a `root` argument.
45
+
46
+ ## Tools
47
+
48
+ | Tool | What it does |
49
+ |------|--------------|
50
+ | `board_init` | Scaffold a project board (router row, `BOARD.md`, `ARCHIVE.md`, 5 subdirs + `.gitkeep`). Idempotent — never clobbers. Optional `agents_md` (default true) writes a marker-fenced usage block into the repo's `AGENTS.md` for hook-less agents. |
51
+ | `board_list_projects` | List projects from `BOARD-ROUTER.md` (id, path, affects prefix). |
52
+ | `board_create_entry` | Create a valid entry (bug/feature/question/observation/learning) with correct frontmatter + required body sections, allocate the next zero-padded id, rebuild the index. Output passes `board-validate-entry.sh`. Optional `parent` links a subtask to an existing entry. |
53
+ | `board_list_entries` | List entries with parsed frontmatter; filters: `project`, `type`, `status`, `needs`, `ready`. `ready: true` is the deterministic ready queue — open entries whose existing `blocked_by` targets are all resolved (dangling ids warn, never block). |
54
+ | `board_get_entry` | Full markdown of one entry by id (+ parsed frontmatter). |
55
+ | `board_update_entry` | Update frontmatter (`status`, `needs`, `priority`, `blocked_by`, `parent`) and/or append a body section; validate the status transition; rebuild the index. Optional `comment: {author, text}` appends a server-timestamped line to the entry's `## Comments` section. |
56
+ | `board_rebuild` | Deterministically regenerate `BOARD.md` from entry files (P0→P3 ordering, `⊘ Q###` when blocked, `↳` child rows under parents, resolved omitted). Idempotent. |
57
+ | `board_capture_finding` | Append a finding to the scratch inbox `_sessions/mcp-<UTC-date>.md`. |
58
+ | `board_claim` | Acquire an entry lock (shells out to `board-claim-acquire.sh`; 0=acquired, 1=contended, 2=stale). |
59
+ | `board_release` | Release an entry lock (shells out to `board-claim-release.sh`; 0=released, 3=owner mismatch/missing, 4=retries exhausted). |
60
+ | `board_remember` | Save a durable insight straight to `learnings/L###-<slug>.md` (`source: remember`) and rebuild the index — explicit intent bypasses the curator's recurrence-≥3 threshold. |
61
+ | `board_status` | Overview: per-type open counts, `in_progress` ids, `blocked` ids, the ready queue (capped at 20) with dangling-blocker warnings, un-promoted scratch count. |
62
+
63
+ All 12 tools from the spec are implemented; none were dropped.
64
+
65
+ ## Configuration
66
+
67
+ The server is published to PyPI as
68
+ [`engineering-board-mcp`](https://pypi.org/project/engineering-board-mcp/)
69
+ (available with the v1.7.0 release), so the primary install is one `uvx` line — no clone,
70
+ no absolute path. The clone path still works everywhere and is the fallback.
71
+
72
+ > **Note (PyPI installs):** `board_claim` / `board_release` shell out to the
73
+ > plugin's `hooks/scripts/board-claim-*.sh`, which the PyPI package does not
74
+ > ship; on a PyPI install those two tools return a clean error unless the
75
+ > plugin (or a repo clone) is present. All other tools are self-contained.
76
+
77
+ ### Claude Code (CLI)
78
+
79
+ ```sh
80
+ # primary — uvx (available with the v1.7.0 release)
81
+ claude mcp add engineering-board -- uvx engineering-board-mcp
82
+ ```
83
+
84
+ Fallback — run from a clone:
85
+
86
+ ```sh
87
+ git clone https://github.com/GhostlyGawd/engineering-board
88
+ claude mcp add engineering-board -- python3 "$(pwd)/engineering-board/mcp-server/engineering_board_mcp.py"
89
+ ```
90
+
91
+ ### Codex CLI
92
+
93
+ Add to `~/.codex/config.toml`:
94
+
95
+ ```toml
96
+ [mcp_servers.engineering-board]
97
+ command = "uvx"
98
+ args = ["engineering-board-mcp"]
99
+ ```
100
+
101
+ Or one line: `codex mcp add engineering-board -- uvx engineering-board-mcp`.
102
+
103
+ ### Gemini CLI
104
+
105
+ Add to `~/.gemini/settings.json` (or per-project `.gemini/settings.json`):
106
+
107
+ ```json
108
+ {
109
+ "mcpServers": {
110
+ "engineering-board": {
111
+ "command": "uvx",
112
+ "args": ["engineering-board-mcp"]
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ Or one line: `gemini mcp add engineering-board uvx engineering-board-mcp`.
119
+
120
+ ### Cursor
121
+
122
+ Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` in the project:
123
+
124
+ ```json
125
+ {
126
+ "mcpServers": {
127
+ "engineering-board": {
128
+ "command": "uvx",
129
+ "args": ["engineering-board-mcp"]
130
+ }
131
+ }
132
+ }
133
+ ```
134
+
135
+ ### Claude Desktop
136
+
137
+ Add to `claude_desktop_config.json` (macOS:
138
+ `~/Library/Application Support/Claude/claude_desktop_config.json`):
139
+
140
+ ```json
141
+ {
142
+ "mcpServers": {
143
+ "engineering-board": {
144
+ "command": "uvx",
145
+ "args": ["engineering-board-mcp"]
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ (Clone fallback: `"command": "python3"`, `"args":
152
+ ["/abs/path/to/engineering-board/mcp-server/engineering_board_mcp.py"]`.)
153
+
154
+ ### Bundled with the plugin (automatic)
155
+
156
+ Installing the `engineering-board` plugin auto-registers this server via the
157
+ repo-root [`.mcp.json`](../.mcp.json), which resolves the script through
158
+ `${CLAUDE_PLUGIN_ROOT}`:
159
+
160
+ ```json
161
+ {
162
+ "mcpServers": {
163
+ "engineering-board": {
164
+ "command": "python3",
165
+ "args": ["${CLAUDE_PLUGIN_ROOT}/mcp-server/engineering_board_mcp.py"]
166
+ }
167
+ }
168
+ }
169
+ ```
170
+
171
+ No separate install step is needed when the plugin is installed.
172
+
173
+ ## Distribution channels
174
+
175
+ The server ships from this repo tree (it shells out to sibling
176
+ `hooks/scripts/board-claim-*.sh` for locking; every other tool is
177
+ self-contained). Beyond cloning the repo, the packaged channels:
178
+
179
+ - **PyPI (`engineering-board-mcp`)** — the uvx one-liner above. Published from
180
+ v1.7.0 by the release workflow via PyPI trusted publishing (OIDC, no stored
181
+ secret); [`pyproject.toml`](pyproject.toml) is the package manifest.
182
+ - **MCP bundle (`.mcpb`)** — `bash mcp-server/build-mcpb.sh` produces
183
+ `dist/engineering-board-mcp.mcpb`, a self-contained bundle (server + the hook
184
+ scripts it calls + [`manifest.json`](manifest.json)) for one-click install in
185
+ MCP-bundle-aware clients. The bundle is a release asset, not committed source.
186
+ - **MCP Registry — live** — published as
187
+ [`io.github.GhostlyGawd/engineering-board`](https://registry.modelcontextprotocol.io/?search=engineering-board);
188
+ [`server.json`](server.json) is the registry manifest, pointing at the `.mcpb`
189
+ release asset. Listings auto-syndicate to PulseMCP / Glama / mcp.so.
190
+ - **Smithery** — [`smithery.yaml`](smithery.yaml) describes the stdio launch for
191
+ `smithery mcp publish`.
192
+
193
+ `server.json`, `manifest.json`, and `smithery.yaml` are version-locked to
194
+ `plugin.json` and validated by the MCP test suite so they cannot silently drift.
195
+
196
+ ## Multi-client: two clients, one board
197
+
198
+ Driving the same board from two MCP clients simultaneously (e.g. Claude Code
199
+ and Claude Desktop) is supported and CI-proven (eb-self Q001): the test suite
200
+ spawns two independent server processes on one board and races them for the
201
+ same entry's claim — exactly one acquires (`exit_code 0`), the other sees clean
202
+ contention (`exit_code 1`), and after the winner releases, the loser can
203
+ acquire. There is no cache layer to go stale: every read hits the same
204
+ committed markdown, and locking is the plugin's atomic `mkdir` claim protocol.
205
+ Use distinct `session_id`s per client (each client's claims are owned by its
206
+ session id).
207
+
208
+ ## Tests
209
+
210
+ ```sh
211
+ bash mcp-server/run-tests.sh
212
+ ```
213
+
214
+ `test_mcp_server.py` (pure python3, no deps) runs two suites:
215
+
216
+ 1. A **real end-to-end stdio session** — spawns the server as a subprocess and drives
217
+ `initialize` → `notifications/initialized` → `tools/list` → several `tools/call`,
218
+ asserting on the JSON-RPC responses (including `-32601`/`-32602` error paths).
219
+ 2. A **full board lifecycle** in a temp repo — `board_init` → `board_create_entry`
220
+ (bug + question + feature + learning) → `board_list_entries` → `board_update_entry`
221
+ → `board_rebuild` → `board_status` → `board_capture_finding` → `board_claim` /
222
+ `board_release`, asserting every created file passes the real
223
+ `hooks/scripts/board-validate-entry.sh`.
224
+
225
+ Exit 0 on all-pass; non-zero with detail on the first failure.
226
+
227
+ ## Notes
228
+
229
+ - The server never writes to stdout except JSON-RPC responses (a hard MCP requirement).
230
+ - Entry filenames are `<ID>-<kebab-slug>.md` (e.g. `B001-export-drops-final-row.md`).
231
+ - `board_create_entry` and `board_update_entry` rebuild `BOARD.md` as their final step
232
+ so a freshly written entry's id is always present in the index (which
233
+ `board-validate-entry.sh` checks).
@@ -0,0 +1,6 @@
1
+ engineering_board_mcp.py,sha256=OK-CQpWie3H66vB3GItWpOeOXdnKxxu41baJjSIogRk,75356
2
+ engineering_board_mcp-1.7.0.dist-info/METADATA,sha256=FRmHOFJZl71n0fO9SmXf03dEIkLTMk5q4ACi4evMkQ0,10590
3
+ engineering_board_mcp-1.7.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
4
+ engineering_board_mcp-1.7.0.dist-info/entry_points.txt,sha256=RVJ7W9-q_PvqXBj_IuoyJHcxd87B44IQM2VP8ZaQM-0,69
5
+ engineering_board_mcp-1.7.0.dist-info/top_level.txt,sha256=Qn2jFe31kUY61bkQVF-Gw3UJ-wlerJGjn-hj7xU1jqY,22
6
+ engineering_board_mcp-1.7.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ engineering-board-mcp = engineering_board_mcp:main
@@ -0,0 +1 @@
1
+ engineering_board_mcp