Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf2d79f9

Browse files
committed
Added get_issue_events , get_issue_timeline and get_issue_event tools
1 parent3134b09 commitf2d79f9

File tree

5 files changed

+604
-0
lines changed

5 files changed

+604
-0
lines changed

‎README.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,27 @@ export GITHUB_MCP_TOOL_ADD_ISSUE_COMMENT_DESCRIPTION="an alternative description
283283
-`repo`: Repository name (string, required)
284284
-`issue_number`: Issue number (number, required)
285285

286+
-**get_issue_events** - Get events for a GitHub issue
287+
-`owner`: Repository owner (string, required)
288+
-`repo`: Repository name (string, required)
289+
-`issue_number`: Issue number (number, required)
290+
-`page`: Page number (number, optional)
291+
-`perPage`: Results per page (number, optional)
292+
293+
-**get_issue_timeline** - Get the timeline of events for a GitHub issue
294+
295+
-`owner`: Repository owner (string, required)
296+
-`repo`: Repository name (string, required)
297+
-`issue_number`: Issue number (number, required)
298+
-`page`: Page number (number, optional)
299+
-`perPage`: Results per page (number, optional)
300+
301+
-**get_issue_event** - Get a specific event for a GitHub issue
302+
303+
-`owner`: Repository owner (string, required)
304+
-`repo`: Repository name (string, required)
305+
-`event_id`: Event ID (number, required)
306+
286307
-**create_issue** - Create a new issue in a GitHub repository
287308

288309
-`owner`: Repository owner (string, required)

‎pkg/github/issues.go

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,218 @@ func GetIssueComments(getClient GetClientFn, t translations.TranslationHelperFun
711711
}
712712
}
713713

714+
// GetIssueTimeline creates a tool to get timeline for a GitHub issue.
715+
funcGetIssueTimeline(getClientGetClientFn,t translations.TranslationHelperFunc) (tool mcp.Tool,handler server.ToolHandlerFunc) {
716+
returnmcp.NewTool("get_issue_timeline",
717+
mcp.WithDescription(t("TOOL_GET_ISSUE_TIMELINE_DESCRIPTION","Get timeline for a GitHub issue")),
718+
mcp.WithString("owner",
719+
mcp.Required(),
720+
mcp.Description("Repository owner"),
721+
),
722+
mcp.WithString("repo",
723+
mcp.Required(),
724+
mcp.Description("Repository name"),
725+
),
726+
mcp.WithNumber("issue_number",
727+
mcp.Required(),
728+
mcp.Description("Issue number"),
729+
),
730+
mcp.WithNumber("page",
731+
mcp.Description("Page number"),
732+
),
733+
mcp.WithNumber("per_page",
734+
mcp.Description("Number of records per page"),
735+
),
736+
),
737+
func(ctx context.Context,request mcp.CallToolRequest) (*mcp.CallToolResult,error) {
738+
owner,err:=requiredParam[string](request,"owner")
739+
iferr!=nil {
740+
returnmcp.NewToolResultError(err.Error()),nil
741+
}
742+
repo,err:=requiredParam[string](request,"repo")
743+
iferr!=nil {
744+
returnmcp.NewToolResultError(err.Error()),nil
745+
}
746+
issueNumber,err:=RequiredInt(request,"issue_number")
747+
iferr!=nil {
748+
returnmcp.NewToolResultError(err.Error()),nil
749+
}
750+
page,err:=OptionalIntParamWithDefault(request,"page",1)
751+
iferr!=nil {
752+
returnmcp.NewToolResultError(err.Error()),nil
753+
}
754+
perPage,err:=OptionalIntParamWithDefault(request,"per_page",30)
755+
iferr!=nil {
756+
returnmcp.NewToolResultError(err.Error()),nil
757+
}
758+
759+
opts:=&github.ListOptions{
760+
Page:page,
761+
PerPage:perPage,
762+
}
763+
764+
client,err:=getClient(ctx)
765+
iferr!=nil {
766+
returnnil,fmt.Errorf("failed to get GitHub client: %w",err)
767+
}
768+
events,resp,err:=client.Issues.ListIssueTimeline(ctx,owner,repo,issueNumber,opts)
769+
iferr!=nil {
770+
returnnil,fmt.Errorf("failed to get issue timeline: %w",err)
771+
}
772+
deferfunc() {_=resp.Body.Close() }()
773+
774+
ifresp.StatusCode!=http.StatusOK {
775+
body,err:=io.ReadAll(resp.Body)
776+
iferr!=nil {
777+
returnnil,fmt.Errorf("failed to read response body: %w",err)
778+
}
779+
returnmcp.NewToolResultError(fmt.Sprintf("failed to get issue timeline: %s",string(body))),nil
780+
}
781+
782+
r,err:=json.Marshal(events)
783+
iferr!=nil {
784+
returnnil,fmt.Errorf("failed to marshal response: %w",err)
785+
}
786+
787+
returnmcp.NewToolResultText(string(r)),nil
788+
}
789+
}
790+
791+
// GetIssueEvents creates a tool to get events for a GitHub issue.
792+
funcGetIssueEvents(getClientGetClientFn,t translations.TranslationHelperFunc) (tool mcp.Tool,handler server.ToolHandlerFunc) {
793+
returnmcp.NewTool("get_issue_events",
794+
mcp.WithDescription(t("TOOL_GET_ISSUE_EVENTS_DESCRIPTION","Get list of events for a GitHub issue")),
795+
mcp.WithString("owner",
796+
mcp.Required(),
797+
mcp.Description("Repository owner"),
798+
),
799+
mcp.WithString("repo",
800+
mcp.Required(),
801+
mcp.Description("Repository name"),
802+
),
803+
mcp.WithNumber("issue_number",
804+
mcp.Required(),
805+
mcp.Description("Issue number"),
806+
),
807+
mcp.WithNumber("page",
808+
mcp.Description("Page number"),
809+
),
810+
mcp.WithNumber("per_page",
811+
mcp.Description("Number of records per page"),
812+
),
813+
),
814+
func(ctx context.Context,request mcp.CallToolRequest) (*mcp.CallToolResult,error) {
815+
owner,err:=requiredParam[string](request,"owner")
816+
iferr!=nil {
817+
returnmcp.NewToolResultError(err.Error()),nil
818+
}
819+
repo,err:=requiredParam[string](request,"repo")
820+
iferr!=nil {
821+
returnmcp.NewToolResultError(err.Error()),nil
822+
}
823+
issueNumber,err:=RequiredInt(request,"issue_number")
824+
iferr!=nil {
825+
returnmcp.NewToolResultError(err.Error()),nil
826+
}
827+
page,err:=OptionalIntParamWithDefault(request,"page",1)
828+
iferr!=nil {
829+
returnmcp.NewToolResultError(err.Error()),nil
830+
}
831+
perPage,err:=OptionalIntParamWithDefault(request,"per_page",30)
832+
iferr!=nil {
833+
returnmcp.NewToolResultError(err.Error()),nil
834+
}
835+
836+
opts:=&github.ListOptions{
837+
Page:page,
838+
PerPage:perPage,
839+
}
840+
841+
client,err:=getClient(ctx)
842+
iferr!=nil {
843+
returnnil,fmt.Errorf("failed to get GitHub client: %w",err)
844+
}
845+
events,resp,err:=client.Issues.ListIssueEvents(ctx,owner,repo,issueNumber,opts)
846+
iferr!=nil {
847+
returnnil,fmt.Errorf("failed to get issue events: %w",err)
848+
}
849+
deferfunc() {_=resp.Body.Close() }()
850+
851+
ifresp.StatusCode!=http.StatusOK {
852+
body,err:=io.ReadAll(resp.Body)
853+
iferr!=nil {
854+
returnnil,fmt.Errorf("failed to read response body: %w",err)
855+
}
856+
returnmcp.NewToolResultError(fmt.Sprintf("failed to get issue events: %s",string(body))),nil
857+
}
858+
859+
r,err:=json.Marshal(events)
860+
iferr!=nil {
861+
returnnil,fmt.Errorf("failed to marshal response: %w",err)
862+
}
863+
864+
returnmcp.NewToolResultText(string(r)),nil
865+
}
866+
}
867+
868+
// GetIssueEvent creates a tool to get an event for a GitHub issue.
869+
funcGetIssueEvent(getClientGetClientFn,t translations.TranslationHelperFunc) (tool mcp.Tool,handler server.ToolHandlerFunc) {
870+
returnmcp.NewTool("get_issue_event",
871+
mcp.WithDescription(t("TOOL_GET_ISSUE_EVENT_DESCRIPTION","Get single event for a GitHub issue")),
872+
mcp.WithString("owner",
873+
mcp.Required(),
874+
mcp.Description("Repository owner"),
875+
),
876+
mcp.WithString("repo",
877+
mcp.Required(),
878+
mcp.Description("Repository name"),
879+
),
880+
mcp.WithNumber("event_id",
881+
mcp.Required(),
882+
mcp.Description("Event ID"),
883+
),
884+
),
885+
func(ctx context.Context,request mcp.CallToolRequest) (*mcp.CallToolResult,error) {
886+
owner,err:=requiredParam[string](request,"owner")
887+
iferr!=nil {
888+
returnmcp.NewToolResultError(err.Error()),nil
889+
}
890+
repo,err:=requiredParam[string](request,"repo")
891+
iferr!=nil {
892+
returnmcp.NewToolResultError(err.Error()),nil
893+
}
894+
eventID,err:=RequiredInt64(request,"event_id")
895+
iferr!=nil {
896+
returnmcp.NewToolResultError(err.Error()),nil
897+
}
898+
899+
client,err:=getClient(ctx)
900+
iferr!=nil {
901+
returnnil,fmt.Errorf("failed to get GitHub client: %w",err)
902+
}
903+
event,resp,err:=client.Issues.GetEvent(ctx,owner,repo,eventID)
904+
iferr!=nil {
905+
returnnil,fmt.Errorf("failed to get issue event: %w",err)
906+
}
907+
deferfunc() {_=resp.Body.Close() }()
908+
909+
ifresp.StatusCode!=http.StatusOK {
910+
body,err:=io.ReadAll(resp.Body)
911+
iferr!=nil {
912+
returnnil,fmt.Errorf("failed to read response body: %w",err)
913+
}
914+
returnmcp.NewToolResultError(fmt.Sprintf("failed to get issue event: %s",string(body))),nil
915+
}
916+
917+
r,err:=json.Marshal(event)
918+
iferr!=nil {
919+
returnnil,fmt.Errorf("failed to marshal response: %w",err)
920+
}
921+
922+
returnmcp.NewToolResultText(string(r)),nil
923+
}
924+
}
925+
714926
// parseISOTimestamp parses an ISO 8601 timestamp string into a time.Time object.
715927
// Returns the parsed time or an error if parsing fails.
716928
// Example formats supported: "2023-01-15T14:30:00Z", "2023-01-15"

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp