Jira MCP Server
About
An MCP server for accessing JIRA issue data stored in Snowflake.
Explore
Setup
Install Jira MCP Server in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/redhat-ai-tools/jira-mcp-snowflake
Follow the installation instructions in the repository README, then restart your MCP client.
An MCP server for accessing JIRA issue data stored in Snowflake.
A Model Context Protocol (MCP) server that provides access to JIRA issue data stored in Snowflake. This server enables AI assistants to query, filter, and analyze JIRA issues through a standardized interface.
This MCP server connects to Snowflake to query JIRA data and provides five main tools for interacting with the data:
- list_jira_issues- Query and filter JIRA issues with various criteria
- get_jira_issue_details- Get detailed information for multiple issues by their keys
- get_jira_project_summary- Get statistics and summaries for all projects
- get_jira_issue_links- Get issue links for a specific JIRA issue by its key
- get_jira_issues_by_sprint- Get all JIRA issues in a specific sprint by sprint name
The server connects to Snowflake and queries the following tables:
- JIRA_ISSUE_NON_PII- Main issue data (non-personally identifiable information)
- JIRA_LABEL_RHAI- Issue labels and tags
- JIRA_COMMENT_NON_PII- Issue comments (non-personally identifiable information)
- JIRA_COMPONENT_RHAI- JIRA project components and their metadata
- JIRA_NODEASSOCIATION_RHAI- Associations between JIRA entities (issues, components, versions)
- JIRA_PROJECTVERSION_NON_PII- Project versions (fix versions and affected versions)
- JIRA_ISSUELINK_RHAI- Links between JIRA issues
- JIRA_ISSUELINKTYPE_RHAI- Types of issue links
- JIRA_CUSTOMFIELDVALUE_NON_PII- Custom field values (e.g., sprint information)
- JIRA_SPRINT_RHAI- Sprint data
- JIRA_CHANGEGROUP_RHAI- Change history groups
- JIRA_CHANGEITEM_RHAI- Individual change items (e.g., status changes)
Note: Table names are expected to exist in your configured Snowflake database and schema.
Query JIRA issues with optional filtering:
- Project filtering- Filter by project key (e.g., 'SMQE', 'OSIM')
- Issue keys filtering- Filter by specific issue keys (e.g., ['SMQE-1280', 'SMQE-1281'])
- Issue type filtering- Filter by issue type ID
- Status filtering- Filter by issue status ID
- Priority filtering- Filter by priority ID
- Text search- Search in summary and description fields
- Component filtering- Filter by component names (comma-separated, matches any)
- Version filtering- Filter by fixed version or affected version name
- Date filtering- Filter by creation, update, or resolution date within last N days
- Timeframe filtering- Filter issues where any date (created, updated, or resolved) is within last N days
- Result limiting- Control number of results returned (default: 50)
- Basic issue information (summary, description, status, priority)
- Timestamps (created, updated, due date, resolution date)
- Metadata (votes, watches, environment, components)
- Associated labels and links
- Fixed and affected versions
2. Get Issue Details (get_jira_issue_details)
Retrieve comprehensive information for multiple JIRA issues by their keys (e.g., ['SMQE-1280', 'SMQE-1281']), including:
- Basic issue information (summary, description, status, priority)
- Timestamps (created, updated, due date, resolution date)
- Time tracking (original estimate, current estimate, time spent)
- Metadata (votes, watches, environment, components, workflow ID, security, archived status)
- Associated labels
- Comments (with comment body, creation/update timestamps, and role level)
- Issue links (inward and outward)
- Status change history
- Fixed and affected versions
- found_issues- Dictionary of found issues keyed by issue key
- not_found- List of issue keys that were not found
- total_found- Number of issues found
- total_requested- Number of issues requested
3. Get Project Summary (get_jira_project_summary)
Generate statistics across all projects:
- Total issue counts per project
- Status distribution per project
- Priority distribution per project
- Overall statistics
4. Get Issue Links (get_jira_issue_links)
Get issue links for a specific JIRA issue by its key (e.g., 'SMQE-1280'):
- Issue links- Relationships to other issues (blocks, is blocked by, relates to, etc.)
- Link direction- Indicates if the link is inward or outward
- Linked issue details- Information about the linked issue
- Issue key and ID
- List of all issue links with link type and direction
- Total count of links
5. Get Issues by Sprint (get_jira_issues_by_sprint)
Get all JIRA issues in a specific sprint by sprint name:
- Sprint filtering- Filter by sprint name (e.g., 'Sprint 256')
- Project filtering- Optional filter by project key (e.g., 'SMQE', 'OSIM')
- Result limiting- Control number of results returned (default: 50)
- All standard issue fields (same aslist_jira_issues)
- Sprint ID and sprint name
- Associated labels and links
- Fixed and affected versions
The server includes optional Prometheus metrics support for monitoring:
- Tool usage tracking- Track calls to each MCP tool with success/error rates and duration
- Snowflake query monitoring- Monitor database query performance and success rates
- Connection tracking- Track active MCP connections
- HTTP endpoints-/metricsfor Prometheus scraping and/healthfor health checks
- Python 3.10+
- UV(Python package manager)
- Podman or Docker
- Access to Snowflake with appropriate credentials
The codebase is organized into modular components in thesrc/directory:
- src/mcp_server.py- Main server entry point and MCP initialization
- src/config.py- Configuration management and environment variable handling
- src/database.py- Snowflake database connection and query execution
- src/tools.py- MCP tool implementations and business logic
- src/metrics.py- Optional Prometheus metrics collection and HTTP server
The following environment variables are used to configure the Snowflake connection:
- SNOWFLAKE_CONNECTION_METHOD- Connection method to use
- Values:api(REST API) orconnector(snowflake-connector-python)
- Default:api
When usingSNOWFLAKE_CONNECTION_METHOD=api:
- SNOWFLAKE_TOKEN- Your Snowflake authentication token (Bearer token)
- SNOWFLAKE_BASE_URL- Snowflake API base URL (e.g.,https://your-account.snowflakecomputing.com/api/v2)
- SNOWFLAKE_DATABASE- Snowflake database name containing your JIRA data
- SNOWFLAKE_SCHEMA- Snowflake schema name containing your JIRA tables
Connector Method (Service Account Support)
When usingSNOWFLAKE_CONNECTION_METHOD=connector:
- SNOWFLAKE_ACCOUNT- Snowflake account identifier (e.g.,your-account.snowflakecomputing.com)
- SNOWFLAKE_DATABASE- Snowflake database name containing your JIRA data
- SNOWFLAKE_SCHEMA- Snowflake schema name containing your JIRA tables
- SNOWFLAKE_WAREHOUSE- Snowflake warehouse name
Private Key Authentication (Recommended for Service Accounts)
- SNOWFLAKE_AUTHENTICATOR- Set tosnowflake_jwt
- SNOWFLAKE_USER- Snowflake username that has the public key registered
- SNOWFLAKE_PRIVATE_KEY_FILE- Path to private key file (PKCS#8 format)
- SNOWFLAKE_PRIVATE_KEY_FILE_PWD- Private key password (optional, if key is encrypted)
- SNOWFLAKE_AUTHENTICATOR- Set tosnowflake(default)
- SNOWFLAKE_USER- Snowflake username
- SNOWFLAKE_PASSWORD- Snowflake password
- SNOWFLAKE_AUTHENTICATOR- Set tooauth_client_credentials
- SNOWFLAKE_OAUTH_CLIENT_ID- OAuth client ID
- SNOWFLAKE_OAUTH_CLIENT_SECRET- OAuth client secret
- SNOWFLAKE_OAUTH_TOKEN_URL- OAuth token URL (optional)
- SNOWFLAKE_AUTHENTICATOR- Set tooauth
- SNOWFLAKE_TOKEN- OAuth access token
- SNOWFLAKE_ROLE- Snowflake role to use (optional)
- MCP_TRANSPORT- Transport protocol for MCP communication
- Default:stdio
# Generate private key openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 # Generate public key openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
Register public key with Snowflake user:
ALTER USER your_service_account SET RSA_PUBLIC_KEY='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...';
export SNOWFLAKE_CONNECTION_METHOD=connector export SNOWFLAKE_AUTHENTICATOR=snowflake_jwt export SNOWFLAKE_ACCOUNT=your-account.snowflakecomputing.com export SNOWFLAKE_USER=your_service_account export SNOWFLAKE_PRIVATE_KEY_FILE=/path/to/rsa_key.p8 export SNOWFLAKE_DATABASE=your_database export SNOWFLAKE_SCHEMA=your_schema export SNOWFLAKE_WAREHOUSE=your_warehouse export SNOWFLAKE_ROLE=your_role
This project has been updated to use UV for dependency management. If you have an existing setup:
Install UV if you haven't already (see Local Development section below)
git clone <repository-url> cd jira-mcp-snowflake
# On macOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # On Windows powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # Or via pip pip install uv
-
Set up environment variables (see Environment Variables section above)
For convenience, several Makefile targets are available to streamline development tasks:
# Install dependencies including dev packages make uv_sync_dev
# Run linting (flake8) make lint # Run tests with coverage make pytest # Run both linting and tests make test
# Build container image with Podman make build
Note: On macOS, you may need to install a newer version of make via Homebrew:
To build the container image locally using Podman, run:
podman build -t localhost/jira-mcp-snowflake:latest .
This will create a local image namedjira-mcp-snowflake:latestthat you can use to run the server. The container now uses UV for fast dependency management.
{ "mcpServers": { "jira-mcp-snowflake": { "command": "podman", "args": [ "run", "-i", "--rm", "-e", "SNOWFLAKE_CONNECTION_METHOD=api", "-e", "SNOWFLAKE_TOKEN=your_token_here", "-e", "SNOWFLAKE_BASE_URL=https://your-account.snowflakecomputing.com/api/v2", "-e", "SNOWFLAKE_DATABASE=your_database_name", "-e", "SNOWFLAKE_SCHEMA=your_schema_name", "-e", "MCP_TRANSPORT=stdio", "-e", "ENABLE_METRICS=true", "-e", "METRICS_PORT=8000", "localhost/jira-mcp-snowflake:latest" ] } } }
Example 2: Private Key Authentication (Service Account)
{ "mcpServers": { "jira-mcp-snowflake": { "command": "podman", "args": [ "run", "-i", "--rm", "-v", "/path/to/your/rsa_key.p8:/app/rsa_key.p8:ro", "-e", "SNOWFLAKE_CONNECTION_METHOD=connector", "-e", "SNOWFLAKE_AUTHENTICATOR=snowflake_jwt", "-e", "SNOWFLAKE_ACCOUNT=your-account.snowflakecomputing.com", "-e", "SNOWFLAKE_USER=your_service_account", "-e", "SNOWFLAKE_PRIVATE_KEY_FILE=/app/rsa_key.p8", "-e", "SNOWFLAKE_DATABASE=your_database_name", "-e", "SNOWFLAKE_SCHEMA=your_schema_name", "-e", "SNOWFLAKE_WAREHOUSE=your_warehouse_name", "-e", "SNOWFLAKE_ROLE=your_role_name", "-e", "MCP_TRANSPORT=stdio", "-e", "ENABLE_METRICS=true", "-e", "METRICS_PORT=8000", "localhost/jira-mcp-snowflake:latest" ] } } }
Then access metrics at:http://localhost:8000/metrics
Example configuration for connecting to a remote instance:
{ "mcpServers": { "jira-mcp-snowflake": { "url": "https://jira-mcp-snowflake.example.com/sse", "headers": { "X-Snowflake-Token": "your_token_here" } } } }
Example configuration to add to VS Code Continue:
{ "experimental": { "modelContextProtocolServers": [ { "name": "jira-mcp-snowflake", "transport": { "type": "stdio", "command": "podman", "args": [ "run", "-i", "--rm", "-e", "SNOWFLAKE_TOKEN=your_token_here", "-e", "SNOWFLAKE_BASE_URL=https://your-account.snowflakecomputing.com/api/v2", "-e", "SNOWFLAKE_DATABASE=your_database_name", "-e", "SNOWFLAKE_SCHEMA=your_schema_name", "-e", "MCP_TRANSPORT=stdio", "-e", "ENABLE_METRICS=true", "-e", "METRICS_PORT=8000", "localhost/jira-mcp-snowflake:latest" ] } } ] } }
# List all issues from the SMQE project result = await list_jira_issues(project="SMQE", limit=10)
# Search for issues containing "authentication" in summary or description result = await list_jira_issues(search_text="authentication", limit=20)
# Find issues in specific components result = await list_jira_issues(components="Security,Authentication", limit=20)
# Find issues with a specific fixed version result = await list_jira_issues(fixed_version="2.5.0", limit=20)
# Find issues created in the last 7 days result = await list_jira_issues(created_days=7, limit=20) # Find issues updated in the last 30 days result = await list_jira_issues(updated_days=30, limit=50)
# Get detailed information for multiple issues result = await get_jira_issue_details(issue_keys=["SMQE-1280", "SMQE-1281"]) # Access the results for issue_key, issue_data in result["found_issues"].items(): print(f"Issue: {issue_key}") print(f"Summary: {issue_data['summary']}") print(f"Status: {issue_data['status']}") print(f"Labels: {issue_data['labels']}") print(f"Comments: {len(issue_data['comments'])}")
# Get all issue links for a specific issue result = await get_jira_issue_links(issue_key="SMQE-1280") # Access the links print(f"Total links: {result['total_links']}") for link in result['links']: print(f"Link type: {link['link_type']}") print(f"Direction: {link['direction']}") print(f"Linked issue: {link['linked_issue_key']}")
# Get all issues in a specific sprint result = await get_jira_issues_by_sprint(sprint_name="Sprint 256", limit=50) # Get issues in a sprint for a specific project result = await get_jira_issues_by_sprint( sprint_name="Sprint 256", project="SMQE", limit=50 ) # Access the results print(f"Sprint: {result['sprint_name']}") print(f"Total issues: {result['total_returned']}") for issue in result['issues']: print(f"Issue: {issue['key']} - {issue['summary']}") print(f"Status: {issue['status']}")
# Get statistics for all projects result = await get_jira_project_summary()
When metrics are enabled, the server provides the following monitoring endpoints:
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



