POST /repos/{owner}/{repo}/issues with JSON {title, body} (title required; body optional)
Optionally include labels:["bug"] and assignees:["login"] — assignees must have push access or are silently dropped
Read the returned issue.number and issue.html_url from the 201 response
To verify: GET /repos/{owner}/{repo}/issues/{number} and confirm title
Issues cannot be deleted via API — close with PATCH /repos/{o}/{r}/issues/{number} {state:"closed"} (admins can hard-delete only via GraphQL deleteIssue)
Known gotchas
Issues API also returns pull requests (a PR is an issue) — when listing, filter out items that have a pull_request field
Assignees without push access to the repo are silently ignored, not errored — the issue is created with no assignee
If Issues are disabled on the repo, POST returns 410 Gone, not 404
Fine-grained PAT needs Issues:write (separate from Contents:write)
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp