Jira MCP Server
Um servidor MCP para acessar dados de issues do JIRA armazenados no Snowflake.
Documentação
Jira MCP Server
Um servidor Model Context Protocol (MCP) que fornece acesso aos dados de issues do JIRA armazenados no Snowflake. Este servidor permite que assistentes de IA consultem, filtrem e analisem issues do JIRA por meio de uma interface padronizada.
Visão Geral
Este servidor MCP conecta-se ao Snowflake para consultar dados do JIRA e fornece cinco ferramentas principais para interagir com os dados:
list_jira_issues- Consulta e filtra issues do JIRA com diversos critériosget_jira_issue_details- Obtém informações detalhadas de múltiplas issues por suas chavesget_jira_project_summary- Obtém estatísticas e resumos de todos os projetosget_jira_issue_links- Obtém links de issue para uma issue específica do JIRA pela sua chaveget_jira_issues_by_sprint- Obtém todas as issues do JIRA em um sprint específico pelo nome do sprint
Recursos
Fontes de Dados
O servidor conecta-se ao Snowflake e consulta as seguintes tabelas:
JIRA_ISSUE_NON_PII- Dados principais das issues (informações não pessoalmente identificáveis)JIRA_LABEL_RHAI- Rótulos e tags das issuesJIRA_COMMENT_NON_PII- Comentários das issues (informações não pessoalmente identificáveis)JIRA_COMPONENT_RHAI- Componentes dos projetos do JIRA e seus metadadosJIRA_NODEASSOCIATION_RHAI- Associações entre entidades do JIRA (issues, componentes, versões)JIRA_PROJECTVERSION_NON_PII- Versões dos projetos (versões corrigidas e versões afetadas)JIRA_ISSUELINK_RHAI- Links entre issues do JIRAJIRA_ISSUELINKTYPE_RHAI- Tipos de links de issueJIRA_CUSTOMFIELDVALUE_NON_PII- Valores de campos personalizados (ex.: informações de sprint)JIRA_SPRINT_RHAI- Dados de sprintJIRA_CHANGEGROUP_RHAI- Grupos de histórico de alteraçõesJIRA_CHANGEITEM_RHAI- Itens de alteração individuais (ex.: mudanças de status)
Nota: Espera-se que os nomes das tabelas existam no banco de dados e schema do Snowflake configurados.
Ferramentas Disponíveis
1. Listar Issues (list_jira_issues)
Consulte issues do JIRA com filtragem opcional:
- Filtro por projeto - Filtre pela chave do projeto (ex.: 'SMQE', 'OSIM')
- Filtro por chaves de issue - Filtre por chaves de issue específicas (ex.: ['SMQE-1280', 'SMQE-1281'])
- Filtro por tipo de issue - Filtre pelo ID do tipo de issue
- Filtro por status - Filtre pelo ID do status da issue
- Filtro por prioridade - Filtre pelo ID da prioridade
- Busca por texto - Pesquise nos campos de resumo e descrição
- Filtro por componente - Filtre por nomes de componentes (separados por vírgula, corresponde a qualquer um)
- Filtro por versão - Filtre pela versão corrigida ou pelo nome da versão afetada
- Filtro por data - Filtre pela data de criação, atualização ou resolução nos últimos N dias
- Filtro por período - Filtre issues em que qualquer data (criação, atualização ou resolução) esteja nos últimos N dias
- Limite de resultados - Controle o número de resultados retornados (padrão: 50)
Retorna informações da issue, incluindo:
- Informações básicas da issue (resumo, descrição, status, prioridade)
- Carimbos de data/hora (criação, atualização, data de vencimento, data de resolução)
- Metadados (votos, observadores, ambiente, componentes)
- Rótulos e links associados
- Versões corrigidas e afetadas
2. Obter Detalhes da Issue (get_jira_issue_details)
Recupere informações abrangentes para múltiplas issues do JIRA por suas chaves (ex.: ['SMQE-1280', 'SMQE-1281']), incluindo:
- Informações básicas da issue (resumo, descrição, status, prioridade)
- Carimbos de data/hora (criação, atualização, data de vencimento, data de resolução)
- Controle de tempo (estimativa original, estimativa atual, tempo gasto)
- Metadados (votos, observadores, ambiente, componentes, ID do fluxo de trabalho, segurança, status de arquivamento)
- Rótulos associados
- Comentários (com corpo do comentário, carimbos de data/hora de criação/atualização e nível de função)
- Links de issue (entrada e saída)
- Histórico de mudanças de status
- Versões corrigidas e afetadas
Retorna um dicionário com:
found_issues- Dicionário de issues encontradas, indexado pela chave da issuenot_found- Lista de chaves de issue que não foram encontradastotal_found- Número de issues encontradastotal_requested- Número de issues solicitadas
3. Obter Resumo do Projeto (get_jira_project_summary)
Gere estatísticas em todos os projetos:
- Contagem total de issues por projeto
- Distribuição de status por projeto
- Distribuição de prioridade por projeto
- Estatísticas gerais
4. Obter Links de Issue (get_jira_issue_links)
Obtenha links de issue para uma issue específica do JIRA pela sua chave (ex.: 'SMQE-1280'):
- Links de issue - Relacionamentos com outras issues (bloqueia, é bloqueado por, relaciona-se a, etc.)
- Direção do link - Indica se o link é de entrada ou saída
- Detalhes da issue vinculada - Informações sobre a issue vinculada
Retorna informações, incluindo:
- Chave e ID da issue
- Lista de todos os links de issue com tipo e direção do link
- Contagem total de links
5. Obter Issues por Sprint (get_jira_issues_by_sprint)
Obtenha todas as issues do JIRA em um sprint específico pelo nome do sprint:
- Filtro por sprint - Filtre pelo nome do sprint (ex.: 'Sprint 256')
- Filtro por projeto - Filtro opcional pela chave do projeto (ex.: 'SMQE', 'OSIM')
- Limite de resultados - Controle o número de resultados retornados (padrão: 50)
Retorna informações da issue, incluindo:
- Todos os campos padrão da issue (mesmos de
list_jira_issues) - ID do sprint e nome do sprint
- Rótulos e links associados
- Versões corrigidas e afetadas
Monitoramento e Métricas
O servidor inclui suporte opcional a métricas do Prometheus para monitoramento:
- Rastreamento de uso de ferramentas - Rastreie chamadas a cada ferramenta MCP com taxas de sucesso/erro e duração
- Monitoramento de consultas do Snowflake - Monitore o desempenho e as taxas de sucesso das consultas ao banco de dados
- Rastreamento de conexões - Rastreie conexões MCP ativas
- Endpoints HTTP -
/metricspara coleta do Prometheus e/healthpara verificações de saúde
Pré-requisitos
- Python 3.10+
- UV (gerenciador de pacotes Python)
- Podman ou Docker
- Acesso ao Snowflake com credenciais apropriadas
Arquitetura
O código-fonte está organizado em componentes modulares no diretório src/:
src/mcp_server.py- Ponto de entrada principal do servidor e inicialização do MCPsrc/config.py- Gerenciamento de configuração e manipulação de variáveis de ambientesrc/database.py- Conexão com o banco de dados Snowflake e execução de consultassrc/tools.py- Implementações das ferramentas MCP e lógica de negóciossrc/metrics.py- Coleta opcional de métricas do Prometheus e servidor HTTP
Variáveis de Ambiente
As seguintes variáveis de ambiente são usadas para configurar a conexão com o Snowflake:
Método de Conexão
SNOWFLAKE_CONNECTION_METHOD- Método de conexão a ser usado- Valores:
api(API REST) ouconnector(snowflake-connector-python) - Padrão:
api
- Valores:
Método da API REST (Padrão)
Ao usar SNOWFLAKE_CONNECTION_METHOD=api:
Obrigatório
SNOWFLAKE_TOKEN- Seu token de autenticação do Snowflake (token Bearer)SNOWFLAKE_BASE_URL- URL base da API do Snowflake (ex.:https://your-account.snowflakecomputing.com/api/v2)SNOWFLAKE_DATABASE- Nome do banco de dados do Snowflake que contém seus dados do JIRASNOWFLAKE_SCHEMA- Nome do schema do Snowflake que contém suas tabelas do JIRA
Método do Conector (Suporte a Conta de Serviço)
Ao usar SNOWFLAKE_CONNECTION_METHOD=connector:
Obrigatório para Todos os Métodos
SNOWFLAKE_ACCOUNT- Identificador da conta do Snowflake (ex.:your-account.snowflakecomputing.com)SNOWFLAKE_DATABASE- Nome do banco de dados do Snowflake que contém seus dados do JIRASNOWFLAKE_SCHEMA- Nome do schema do Snowflake que contém suas tabelas do JIRASNOWFLAKE_WAREHOUSE- Nome do warehouse do Snowflake
Métodos de Autenticação
Autenticação por Chave Privada (Recomendada para Contas de Serviço)
SNOWFLAKE_AUTHENTICATOR- Defina comosnowflake_jwtSNOWFLAKE_USER- Nome de usuário do Snowflake que possui a chave pública registradaSNOWFLAKE_PRIVATE_KEY_FILE- Caminho para o arquivo de chave privada (formato PKCS#8)SNOWFLAKE_PRIVATE_KEY_FILE_PWD- Senha da chave privada (opcional, se a chave estiver criptografada)
Autenticação por Nome de Usuário/Senha
SNOWFLAKE_AUTHENTICATOR- Defina comosnowflake(padrão)SNOWFLAKE_USER- Nome de usuário do SnowflakeSNOWFLAKE_PASSWORD- Senha do Snowflake
Credenciais de Cliente OAuth
SNOWFLAKE_AUTHENTICATOR- Defina comooauth_client_credentialsSNOWFLAKE_OAUTH_CLIENT_ID- ID do cliente OAuthSNOWFLAKE_OAUTH_CLIENT_SECRET- Segredo do cliente OAuthSNOWFLAKE_OAUTH_TOKEN_URL- URL do token OAuth (opcional)
Token OAuth
SNOWFLAKE_AUTHENTICATOR- Defina comooauthSNOWFLAKE_TOKEN- Token de acesso OAuth
Opcional
SNOWFLAKE_ROLE- Função do Snowflake a ser usada (opcional)
Configuração Geral
MCP_TRANSPORT- Protocolo de transporte para comunicação MCP- Padrão:
stdio
- Padrão:
ENABLE_METRICS- Habilite a coleta de métricas do Prometheus- Padrão:
false
- Padrão:
METRICS_PORT- Porta para o servidor HTTP de métricas- Padrão:
8000
- Padrão:
Exemplo de Configuração de Chave Privada
Para configurar a autenticação por chave privada:
-
Gere o par de chaves RSA:
# 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 -
Registre a chave pública no usuário do Snowflake:
ALTER USER your_service_account SET RSA_PUBLIC_KEY='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...'; -
Defina as variáveis de ambiente:
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
Instalação e Configuração
Migração de pip para UV
Este projeto foi atualizado para usar UV para gerenciamento de dependências. Se você já possui uma configuração existente:
-
Remova seu ambiente virtual antigo:
rm -rf venv/ -
Instale o UV se ainda não o fez (consulte a seção Desenvolvimento Local abaixo)
-
Instale as dependências com UV:
uv sync
Desenvolvimento Local
- Clone o repositório:
git clone <repository-url>
cd jira-mcp-snowflake
- Instale o UV se ainda não o fez:
# 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
- Instale as dependências:
uv sync
-
Configure as variáveis de ambiente (consulte a seção Variáveis de Ambiente acima)
-
Execute o servidor:
uv run python src/mcp_server.py
Usando Alvos do Makefile
Para conveniência, vários alvos do Makefile estão disponíveis para agilizar tarefas de desenvolvimento:
Configuração de Desenvolvimento
# Install dependencies including dev packages
make uv_sync_dev
Testes e Garantia de Qualidade
# Run linting (flake8)
make lint
# Run tests with coverage
make pytest
# Run both linting and tests
make test
Compilação
# Build container image with Podman
make build
Nota: No macOS, talvez seja necessário instalar uma versão mais recente do make via Homebrew:
brew install make
Implantação em Contêiner
Compilando localmente
Para compilar a imagem do contêiner localmente usando Podman, execute:
podman build -t localhost/jira-mcp-snowflake:latest .
Isso criará uma imagem local chamada jira-mcp-snowflake:latest que você pode usar para executar o servidor. O contêiner agora usa UV para gerenciamento rápido de dependências.
Executando com Podman ou Docker
Exemplo 1: API REST com Token
{
"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"
]
}
}
}
Exemplo 2: Autenticação por Chave Privada (Conta de Serviço)
{
"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"
]
}
}
}
Em seguida, acesse as métricas em: http://localhost:8000/metrics
Conectando a uma instância remota
Exemplo de configuração para conectar a uma instância remota:
{
"mcpServers": {
"jira-mcp-snowflake": {
"url": "https://jira-mcp-snowflake.example.com/sse",
"headers": {
"X-Snowflake-Token": "your_token_here"
}
}
}
}
Integração com VS Code Continue
Exemplo de configuração para adicionar ao 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"
]
}
}
]
}
}
Exemplos de Uso
Consultar Issues por Projeto
# List all issues from the SMQE project
result = await list_jira_issues(project="SMQE", limit=10)
Pesquisar Issues por Texto
# Search for issues containing "authentication" in summary or description
result = await list_jira_issues(search_text="authentication", limit=20)
Filtrar Issues por Componente
# Find issues in specific components
result = await list_jira_issues(components="Security,Authentication", limit=20)
Filtrar Issues por Versão
# Find issues with a specific fixed version
result = await list_jira_issues(fixed_version="2.5.0", limit=20)
Filtrar Issues por Data
# 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)
Obter Detalhes de uma Issue Específica
# 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'])}")
Obter Links de Issue
# 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']}")
Obter Issues por Sprint
# 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']}")
Obter Visão Geral do Projeto
# Get statistics for all projects
result = await get_jira_project_summary()
Monitoramento
Quando as métricas estão habilitadas, o servidor fornece os seguintes endpoints de monitoramento:
/metrics- Endpoint de métricas do Prometheus para coleta/health- Endpoint de verificação de saúde que retorna status em JSON
Métricas Disponíveis
mcp_tool_calls_total- Contador de chamadas de ferramentas por nome e status da ferramentamcp_tool_call_duration_seconds- Histograma das durações das chamadas de ferramentasmcp_active_connections- Medidor de conexões MCP ativasmcp_snowflake_queries_total- Contador de consultas do Snowflake por statusmcp_snowflake_query_duration_seconds- Histograma das durações das consultas do Snowflake
Privacidade de Dados
Este servidor foi projetado para trabalhar apenas com dados não pessoalmente identificáveis (não-PII). As tabelas do Snowflake devem conter dados sanitizados, com qualquer informação pessoal sensível removida.
Considerações de Segurança
- Variáveis de Ambiente: Armazene informações sensíveis como
SNOWFLAKE_TOKENem variáveis de ambiente, nunca no código - Segurança do Token: Garanta que seu token do Snowflake seja mantido seguro e rotacionado regularmente
- Segurança de Rede: Use endpoints HTTPS e conexões de rede seguras
- Controle de Acesso: Siga o princípio do menor privilégio para acesso ao banco de dados do Snowflake
- Prevenção de Injeção de SQL: O servidor inclui sanitização de entrada para prevenir ataques de injeção de SQL
Dependências
httpx- Biblioteca cliente HTTP para comunicação com a API do Snowflakefastmcp- Framework rápido de servidor MCPprometheus_client- Cliente de métricas Prometheus (opcional, para monitoramento)
Desenvolvimento
Estrutura do Código
O projeto segue uma arquitetura modular:
jira-mcp-snowflake/
├── src/
│ ├── mcp_server.py # Main entry point
│ ├── config.py # Configuration and environment variables
│ ├── database.py # Snowflake database operations
│ ├── tools.py # MCP tool implementations
│ └── metrics.py # Prometheus metrics (optional)
├── requirements.txt # Python dependencies
└── README.md # This file
Adicionando Novas Ferramentas
Para adicionar novas ferramentas MCP:
- Adicione a função da ferramenta em
src/tools.py - Decore com
@mcp.tool()e@track_tool_usage("tool_name") - Siga os padrões existentes para tratamento de erros e registro de logs
- Atualize este README com a documentação da nova ferramenta