Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
mcp-server-jira
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-solutions
mcp-server-jira
Commits
b69cd95b
Commit
b69cd95b
authored
Mar 04, 2026
by
MD. SHAHIDUL ISLAM
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: format Jira issue links in output messages as Markdown clickable links.
parent
29a85ba4
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
11 additions
and
12 deletions
+11
-12
jira_mcp_server.py
jira_mcp_server.py
+11
-12
No files found.
jira_mcp_server.py
View file @
b69cd95b
...
@@ -81,7 +81,7 @@ def get_my_assigned_issues() -> str:
...
@@ -81,7 +81,7 @@ def get_my_assigned_issues() -> str:
result
=
[
"Your Open Assigned Issues:"
]
result
=
[
"Your Open Assigned Issues:"
]
for
issue
in
issues
:
for
issue
in
issues
:
result
.
append
(
f
"- [
{issue.key}] {issue.fields.summary} (Status: {issue.fields.status.name}, Priority: {issue.fields.priority.name if issue.fields.priority else 'None'})
\n
URL: {BASE_URL}/browse/{issue.key}
"
)
result
.
append
(
f
"- [
[{issue.key}]]({BASE_URL}/browse/{issue.key}) {issue.fields.summary} (Status: {issue.fields.status.name}, Priority: {issue.fields.priority.name if issue.fields.priority else 'None'})
"
)
return
"
\n
"
.
join
(
result
)
return
"
\n
"
.
join
(
result
)
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error fetching issues: {str(e)}"
return
f
"Error fetching issues: {str(e)}"
...
@@ -97,8 +97,7 @@ def get_issue_details(issue_key: str) -> str:
...
@@ -97,8 +97,7 @@ def get_issue_details(issue_key: str) -> str:
description
=
issue
.
fields
.
description
or
"No description provided."
description
=
issue
.
fields
.
description
or
"No description provided."
details
=
[
details
=
[
f
"Issue: {issue.key}"
,
f
"Issue: [{issue.key}]({BASE_URL}/browse/{issue.key})"
,
f
"URL: {BASE_URL}/browse/{issue.key}"
,
f
"Summary: {issue.fields.summary}"
,
f
"Summary: {issue.fields.summary}"
,
f
"Type: {issue.fields.issuetype.name}"
,
f
"Type: {issue.fields.issuetype.name}"
,
f
"Status: {issue.fields.status.name}"
,
f
"Status: {issue.fields.status.name}"
,
...
@@ -131,7 +130,7 @@ def create_issue(summary: str, description: str, project_key: str = None, issue_
...
@@ -131,7 +130,7 @@ def create_issue(summary: str, description: str, project_key: str = None, issue_
'issuetype'
:
{
'name'
:
issue_type
},
'issuetype'
:
{
'name'
:
issue_type
},
}
}
new_issue
=
jira
.
create_issue
(
fields
=
issue_dict
)
new_issue
=
jira
.
create_issue
(
fields
=
issue_dict
)
return
f
"Successfully created issue
{new_issue.key}. URL: {BASE_URL}/browse/{new_issue.key}
"
return
f
"Successfully created issue
[{new_issue.key}]({BASE_URL}/browse/{new_issue.key}).
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error creating issue: {str(e)}"
return
f
"Error creating issue: {str(e)}"
...
@@ -189,7 +188,7 @@ def create_issue_advanced(
...
@@ -189,7 +188,7 @@ def create_issue_advanced(
issue_dict
[
'timetracking'
]
=
{
'originalEstimate'
:
original_estimate
}
issue_dict
[
'timetracking'
]
=
{
'originalEstimate'
:
original_estimate
}
new_issue
=
jira
.
create_issue
(
fields
=
issue_dict
)
new_issue
=
jira
.
create_issue
(
fields
=
issue_dict
)
return
f
"Successfully created {issue_type}
{new_issue.key}. URL: {BASE_URL}/browse/{new_issue.key}
"
return
f
"Successfully created {issue_type}
[{new_issue.key}]({BASE_URL}/browse/{new_issue.key}).
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error creating advanced issue: {str(e)}"
return
f
"Error creating advanced issue: {str(e)}"
...
@@ -226,7 +225,7 @@ def create_issue_with_subtasks(summary: str, description: str, subtasks: List[st
...
@@ -226,7 +225,7 @@ def create_issue_with_subtasks(summary: str, description: str, subtasks: List[st
created_subtasks
.
append
(
st_issue
.
key
)
created_subtasks
.
append
(
st_issue
.
key
)
subtasks_str
=
", "
.
join
(
created_subtasks
)
subtasks_str
=
", "
.
join
(
created_subtasks
)
return
f
"Successfully created {parent_issue_type}
{parent_issue.key} with subtasks: {subtasks_str}. URL: {BASE_URL}/browse/{parent_issue.key}
"
return
f
"Successfully created {parent_issue_type}
[{parent_issue.key}]({BASE_URL}/browse/{parent_issue.key}) with subtasks: {subtasks_str}.
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error creating {parent_issue_type} with subtasks: {str(e)}"
return
f
"Error creating {parent_issue_type} with subtasks: {str(e)}"
...
@@ -268,7 +267,7 @@ def create_bulk_issues(issues_data: List[dict], project_key: str = None) -> str:
...
@@ -268,7 +267,7 @@ def create_bulk_issues(issues_data: List[dict], project_key: str = None) -> str:
for
issue_result
in
created_issues
:
for
issue_result
in
created_issues
:
if
issue_result
.
get
(
'issue'
):
if
issue_result
.
get
(
'issue'
):
iss
=
issue_result
[
'issue'
]
iss
=
issue_result
[
'issue'
]
result
.
append
(
f
"- [
{iss.key}] URL: {BASE_URL}/browse/{iss.key}
"
)
result
.
append
(
f
"- [
[{iss.key}]]({BASE_URL}/browse/{iss.key})
"
)
else
:
else
:
result
.
append
(
f
"- Failed to create issue: {issue_result.get('error')}"
)
result
.
append
(
f
"- Failed to create issue: {issue_result.get('error')}"
)
...
@@ -283,7 +282,7 @@ def assign_issue_to_me(issue_key: str) -> str:
...
@@ -283,7 +282,7 @@ def assign_issue_to_me(issue_key: str) -> str:
try
:
try
:
# Provide the username we authenticated with
# Provide the username we authenticated with
jira
.
assign_issue
(
issue_key
,
JIRA_USERNAME
)
jira
.
assign_issue
(
issue_key
,
JIRA_USERNAME
)
return
f
"Successfully assigned issue
{issue_key} to {JIRA_USERNAME}. URL: {BASE_URL}/browse/{issue_key}
"
return
f
"Successfully assigned issue
[{issue_key}]({BASE_URL}/browse/{issue_key}) to {JIRA_USERNAME}.
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error assigning issue {issue_key}: {str(e)}"
return
f
"Error assigning issue {issue_key}: {str(e)}"
...
@@ -310,7 +309,7 @@ def transition_issue(issue_key: str, transition_name: str) -> str:
...
@@ -310,7 +309,7 @@ def transition_issue(issue_key: str, transition_name: str) -> str:
# Execute the transition
# Execute the transition
jira
.
transition_issue
(
issue_key
,
transition_id
)
jira
.
transition_issue
(
issue_key
,
transition_id
)
return
f
"Successfully transitioned issue
{issue_key} to '{transition_name}'. URL: {BASE_URL}/browse/{issue_key}
"
return
f
"Successfully transitioned issue
[{issue_key}]({BASE_URL}/browse/{issue_key}) to '{transition_name}'.
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error transitioning issue {issue_key}: {str(e)}"
return
f
"Error transitioning issue {issue_key}: {str(e)}"
...
@@ -330,7 +329,7 @@ def search_issues(jql_query: str) -> str:
...
@@ -330,7 +329,7 @@ def search_issues(jql_query: str) -> str:
for
issue
in
issues
:
for
issue
in
issues
:
assignee
=
issue
.
fields
.
assignee
.
displayName
if
issue
.
fields
.
assignee
else
"Unassigned"
assignee
=
issue
.
fields
.
assignee
.
displayName
if
issue
.
fields
.
assignee
else
"Unassigned"
priority
=
issue
.
fields
.
priority
.
name
if
getattr
(
issue
.
fields
,
'priority'
,
None
)
else
'None'
priority
=
issue
.
fields
.
priority
.
name
if
getattr
(
issue
.
fields
,
'priority'
,
None
)
else
'None'
result
.
append
(
f
"- [
{issue.key}] {issue.fields.summary} (Status: {issue.fields.status.name}, Assignee: {assignee}, Priority: {priority})
\n
URL: {BASE_URL}/browse/{issue.key}
"
)
result
.
append
(
f
"- [
[{issue.key}]]({BASE_URL}/browse/{issue.key}) {issue.fields.summary} (Status: {issue.fields.status.name}, Assignee: {assignee}, Priority: {priority})
"
)
return
"
\n
"
.
join
(
result
)
return
"
\n
"
.
join
(
result
)
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error searching issues: {str(e)}"
return
f
"Error searching issues: {str(e)}"
...
@@ -357,7 +356,7 @@ def add_comment_to_issue(issue_key: str, comment: str) -> str:
...
@@ -357,7 +356,7 @@ def add_comment_to_issue(issue_key: str, comment: str) -> str:
jira
=
_get_jira
()
jira
=
_get_jira
()
try
:
try
:
jira
.
add_comment
(
issue_key
,
comment
)
jira
.
add_comment
(
issue_key
,
comment
)
return
f
"Successfully added comment to
{issue_key}. URL: {BASE_URL}/browse/{issue_key}
"
return
f
"Successfully added comment to
[{issue_key}]({BASE_URL}/browse/{issue_key}).
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error adding comment to {issue_key}: {str(e)}"
return
f
"Error adding comment to {issue_key}: {str(e)}"
...
@@ -385,7 +384,7 @@ def log_work_on_issue(issue_key: str, time_spent: str) -> str:
...
@@ -385,7 +384,7 @@ def log_work_on_issue(issue_key: str, time_spent: str) -> str:
jira
=
_get_jira
()
jira
=
_get_jira
()
try
:
try
:
jira
.
add_worklog
(
issue_key
,
timeSpent
=
time_spent
)
jira
.
add_worklog
(
issue_key
,
timeSpent
=
time_spent
)
return
f
"Successfully logged {time_spent} of work on
{issue_key}. URL: {BASE_URL}/browse/{issue_key}
"
return
f
"Successfully logged {time_spent} of work on
[{issue_key}]({BASE_URL}/browse/{issue_key}).
"
except
Exception
as
e
:
except
Exception
as
e
:
return
f
"Error logging work on {issue_key}: {str(e)}"
return
f
"Error logging work on {issue_key}: {str(e)}"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment