For agents and scripts
The full guide, written for AI models, is /agents.md (also /llms.txt). Point an agent at it.
Everything the grid does goes through /api/v1. Send Authorization: Bearer nmt_… with a token from the Admin page. A token belongs to one workspace and sees only its projects. Reads answer JSON, or plain text with ?format=text.
The CLI
One file, no dependencies, Node 18 or later:
curl -fsSo ~/.local/bin/nmt https://NotMeantTo.com/cli/nmt.js && chmod +x ~/.local/bin/nmt export NMT_URL=https://NotMeantTo.com NMT_TOKEN=nmt_…
Run from a repository folder, it works on the project named after that folder (NotHangman.com, …); --project or NMT_PROJECT overrides. nmt help lists every command; the everyday ones:
nmt the work order: priority, urgency, size smallest first (top 20) nmt url the link to that list in the browser; end every development session with it nmt inbox requests and questions waiting on this project nmt search "words" titles, descriptions and threads, closed issues too nmt claim NH10023 take it to work on; nmt working lists yours, nmt release lets go nmt list --all everything open, on-dev included (--closed, --active) nmt show NH10023 one issue nmt add 2 "Title" "One-paragraph description" [--prefix --status --urgency --size] nmt set NH10023 [NH10024 …] priority=1 urgency=0 size=S nmt ship NH10023 [rel] send to testing nmt deliver NH10023 mark done (someone other than the fixer) nmt cancel NH10023 "why" nmt history NH10023 nmt export write TODO.csv and TODONE.csv here
MCP
The same work as tools, for a session that would rather not shell out. Streamable HTTP at /mcp, the same bearer token, reading tools only for a viewer token:
claude mcp add --transport http notmeantto https://NotMeantTo.com/mcp --header "Authorization: Bearer nmt_…"
Tools: list_projects, list_issues, get_issue, issue_history, create_issue, update_issue, bulk_update, ship_issue, deliver_issue, cancel_issue, release_notes.
Endpoints
GET /api/v1/me
GET /api/v1/projects
GET /api/v1/issues?project=&scope=open|todo|active|waiting|closed|all&limit=
GET /api/v1/search?q=&project=&scope=
GET /api/v1/issues/:id /history
GET /api/v1/changes?since=<cursor>&project=
POST /api/v1/projects/:project/issues {title, description, priority, status, urgency, size, prefix}
PATCH /api/v1/issues/:id {field: value, …, version?} 409 if version is stale
POST /api/v1/issues/bulk {items: [{key, project?, version?}], patch}
POST /api/v1/issues/:id/ship {release}
POST /api/v1/issues/:id/deliver {release?, date?}
POST /api/v1/issues/:id/cancel {reason}
GET /api/v1/projects/:project/export/todo (and /todone): the CSV, exactly as the spec writes it
GET /api/v1/projects/:project/check
GET /api/v1/projects/:project/notes/:release
POST /api/v1/projects/:project/import {todo, todone} CSV text (admin)
Writes are validated against the task format (titles to 80 characters, descriptions to 600, one line, release and delivered rules). A 422 lists each problem by field. Closed issues are never reopened.