gabriel / musehub public
feat BREAKING feat/issue-crud-mcp #1 / 1
AI Agent gabriel · 170 days ago · Apr 10, 2026 · Diff

feat: add 5 dedicated issue MCP tools (close, reopen, assign, set_labels, remove_label)

- Add execute_close_issue, execute_reopen_issue, execute_assign_issue, execute_set_issue_labels, execute_remove_issue_label executors - Add musehub_close_issue, musehub_reopen_issue, musehub_assign_issue, musehub_set_issue_labels, musehub_remove_issue_label tool definitions - Wire all 5 tools in dispatcher; auth-gated as write tools - Grow tool count from 68 to 73; update test assertion - Add 25 integration tests covering happy paths, idempotency, and error paths - Update docs/reference/mcp.md: Write Tools count 17 → 22

sha256:3c970c31e3f83085b6d8fcafe5ee0f74b64f4c621e1c297aac81b61df2e3283d sha
+41 ~24 −2 symbols
sha256:793767a4f8b56705acb3ac95ffe8685fc03386fcf22e6d3f28909d1cf5c526f1 snapshot
+41
symbols added
~24
symbols modified
−2
symbols removed
0
dead code introduced
Semantic Changes 67 symbols
~ docs/reference/mcp.md .md 6 symbols added, 1 symbol removed, 17 symbols modified
− Write Tools (17) section Write Tools (17) L531–780
+ Write Tools (22) section Write Tools (22) L531–838
+ musehub_assign_issue section musehub_assign_issue L725–736
+ musehub_close_issue section musehub_close_issue L703–713
+ musehub_remove_issue_label section musehub_remove_issue_label L749–760
+ musehub_reopen_issue section musehub_reopen_issue L714–724
+ musehub_set_issue_labels section musehub_set_issue_labels L737–748
~ Tools
~ musehub/mcp/dispatcher.py .py 1 symbol modified
~ musehub/mcp/write_tools/issues.py .py 5 symbols added
+ execute_assign_issue function async_function execute_assign_issue L346–393
+ execute_close_issue function async_function execute_close_issue L260–300
+ execute_remove_issue_label function async_function execute_remove_issue_label L447–494
+ execute_reopen_issue function async_function execute_reopen_issue L303–343
+ execute_set_issue_labels function async_function execute_set_issue_labels L396–444
~ tests/test_mcp_dispatcher.py .py 1 symbol added, 1 symbol removed, 1 symbol modified
− test_tool_catalogue_has_68_tools function function test_tool_catalogue_has_68_tools L170–172
+ test_tool_catalogue_has_73_tools function function test_tool_catalogue_has_73_tools L170–172
~ tests/test_mcp_write_tools.py .py 29 symbols added, 4 symbols modified
+ TestDataIntegrityIssueStateTransitions class class TestDataIntegrityIssueStateTransitions L1208–1237
+ test_assign_then_unassign_persisted method async_method test_assign_then_unassign_persisted L1225–1237
+ test_close_then_reopen_cycle method async_method test_close_then_reopen_cycle L1210–1222
+ TestIntegrationAssignIssue class class TestIntegrationAssignIssue L1084–1120
+ test_assign_sets_assignee method async_method test_assign_sets_assignee L1086–1096
+ test_assign_unknown_issue_returns_error method async_method test_assign_unknown_issue_returns_error L1113–1120
+ test_unassign_with_empty_string method async_method test_unassign_with_empty_string L1099–1110
+ TestIntegrationCloseIssue class class TestIntegrationCloseIssue L1009–1047
+ test_close_already_closed_is_idempotent method async_method test_close_already_closed_is_idempotent L1023–1032
+ test_close_open_issue method async_method test_close_open_issue L1011–1020
+ test_close_unknown_issue_returns_error method async_method test_close_unknown_issue_returns_error L1035–1040
+ test_close_unknown_repo_returns_error method async_method test_close_unknown_repo_returns_error L1043–1047
+ TestIntegrationRemoveIssueLabel class class TestIntegrationRemoveIssueLabel L1165–1205
+ test_remove_absent_label_is_idempotent method async_method test_remove_absent_label_is_idempotent L1183–1195
+ test_remove_existing_label method async_method test_remove_existing_label L1167–1180
+ test_remove_label_unknown_issue_returns_error method async_method test_remove_label_unknown_issue_returns_error L1198–1205
+ TestIntegrationReopenIssue class class TestIntegrationReopenIssue L1050–1081
+ test_reopen_already_open_is_idempotent method async_method test_reopen_already_open_is_idempotent L1065–1073
+ test_reopen_closed_issue method async_method test_reopen_closed_issue L1052–1062
+ test_reopen_unknown_issue_returns_error method async_method test_reopen_unknown_issue_returns_error L1076–1081
+ TestIntegrationSetIssueLabels class class TestIntegrationSetIssueLabels L1123–1162
+ test_set_empty_labels_clears_all method async_method test_set_empty_labels_clears_all L1140–1152
+ test_set_labels_replaces_all method async_method test_set_labels_replaces_all L1125–1137
+ test_set_labels_unknown_issue_returns_error method async_method test_set_labels_unknown_issue_returns_error L1155–1162
+ execute_assign_issue import import execute_assign_issue L76–76
+ execute_close_issue import import execute_close_issue L76–76
+ execute_remove_issue_label import import execute_remove_issue_label L76–76
+ execute_reopen_issue import import execute_reopen_issue L76–76
+ execute_set_issue_labels import import execute_set_issue_labels L76–76
← Older Oldest on feat/issue-crud-mcp
All commits
Newer → Latest on feat/issue-crud-mcp

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:3c970c31e3f83085b6d8fcafe5ee0f74b64f4c621e1c297aac81b61df2e3283d --body "your comment"