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.
- engineering_board_mcp-1.7.0.dist-info/METADATA +233 -0
- engineering_board_mcp-1.7.0.dist-info/RECORD +6 -0
- engineering_board_mcp-1.7.0.dist-info/WHEEL +5 -0
- engineering_board_mcp-1.7.0.dist-info/entry_points.txt +2 -0
- engineering_board_mcp-1.7.0.dist-info/top_level.txt +1 -0
- engineering_board_mcp.py +1818 -0
|
@@ -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 @@
|
|
|
1
|
+
engineering_board_mcp
|