Done: MCP threads{ repo, number, anchor?, resolved? } lists a pull's review threads, or with anchor resolves (resolved: true) or reopens one, through the same action the API uses (pullThreads and resolveReviewThread, GET …/pulls/:number/threads and POST/DELETE …/threads/:anchor/resolve), so its rules, refusals and access are exactly the route's — no second implementation.
[ ] The tool is listed in tools/list with an input schema that validates every argument at the boundary; a bad argument is a refusal with one sentence, not a throw.
[ ] The answer is JSON with a says sentence, like the tools beside it.
[ ] A row in docs/MCP.md's tool table.
[ ] Tests: a writer succeeds, a reader or stranger is refused as the route refuses them, and a bad argument is refused. An unknown anchor is refused.
Files: src/http/mcp.ts, docs/MCP.md, one new test file.
Risk: mcp.ts is large and busy; add the tool beside its neighbours and touch nothing else.
Done: MCP
threads{ repo, number, anchor?, resolved? }lists a pull's review threads, or withanchorresolves (resolved: true) or reopens one, through the same action the API uses (pullThreadsandresolveReviewThread, GET …/pulls/:number/threads and POST/DELETE …/threads/:anchor/resolve), so its rules, refusals and access are exactly the route's — no second implementation.sayssentence, like the tools beside it.Files: src/http/mcp.ts, docs/MCP.md, one new test file. Risk: mcp.ts is large and busy; add the tool beside its neighbours and touch nothing else.