jira-gateway
Exposes Jira task management (list, create with two-step confirmation, start) to AI agents while keeping credentials hidden, and deliberately does not handle git operations.
README
jira-gateway
MCP local que expone 3 acciones al agente: list_my_tasks, create_task
(con confirmación obligatoria en dos pasos) y start_task. Alcance
deliberadamente reducido a Jira — git (rama, commits, push, historial) lo
sigue manejando Claude Code directamente por bash, como ya hacías. Este
gateway no intenta ser una barrera para git; solo cubre lo que el agente no
puede hacer por sí mismo: hablar con Jira sin ver tus credenciales.
Instalación
Requiere Python >=3.11. Si tu Python de sistema es más antiguo, usa
uv para que te instale un 3.11 aislado en el
propio .venv sin tocar nada del sistema:
curl -LsSf https://astral.sh/uv/install.sh | sh
cd jira-git-gateway
uv venv --python 3.11
source .venv/bin/activate
uv pip install -e .
(Alternativa sin uv, si ya tienes Python 3.11+ disponible en el sistema:
python3 -m venv .venv && source .venv/bin/activate && pip install -e .)
Configuración (variables de entorno)
Crea ~/.jira-gateway.env (fuera de este repo — la ruta exacta es
configurable con JIRA_GATEWAY_ENV_FILE si quieres otra):
JIRA_EMAIL=tu-email@dominio.com
JIRA_API_TOKEN=el-token-con-scope-write:jira-work-y-read:jira-work
JIRA_CLOUD_ID=... # GET https://tudominio.atlassian.net/_edge/tenant_info
JIRA_SITE_URL=https://tudominio.atlassian.net
JIRA_PROJECT_KEY=PROJ
JIRA_IN_PROGRESS_STATUS=In Progress # opcional, ajusta al nombre real de tu workflow
JIRA_SELECTED_STATUS=Selected for Development # opcional, estado al que pasa create_task tras crear
JIRA_DEFAULT_ISSUE_TYPE=Task # opcional, ajusta al nombre real de tu tipo de issue
gateway/config.py lo carga solo (vía python-dotenv) al arrancar —no hace
falta exportarlo en tu shell ni pasarlo por la config de MCP. Motivo de que
viva fuera del repo: así no está a la vista dentro del directorio que Claude
Code tiene abierto mientras curras. No es una barrera de seguridad dura —un
agente con Bash sin restricciones podría igualmente leer esa ruta si se lo
propone— pero evita la exposición accidental y evita duplicar el token en
~/.claude.json al configurar el MCP. Si quieres una barrera más fuerte
(un usuario Unix separado que de verdad no pueda leer el token), usa el
modo servicio de la sección de abajo.
Añadirlo a Claude Code
Hay dos formas de conectarlo. Ojo: en ambas, Claude Code corre con tu mismo
usuario del sistema, así que cualquier cosa que ese usuario pueda leer
(incluido un .env en el propio repo, o la config de MCP donde metas el
token) el agente también puede leerla por Bash si se lo propone — el
subproceso stdio no es una barrera real contra eso, solo una forma cómoda
de que el agente no necesite tocar el token para hacer su trabajo normal.
Opción A — stdio (rápida, sin aislamiento real de credenciales)
Como ~/.jira-gateway.env ya lo carga el propio config.py, aquí no hace
falta pasar ningún env — así el token tampoco queda duplicado dentro de
~/.claude.json:
{
"mcpServers": {
"jira-gateway": {
"command": "/ruta/a/jira-git-gateway/.venv/bin/python",
"args": ["-m", "gateway.server"]
}
}
}
(No hace falta cwd: el paquete queda instalado en modo editable en el
venv, así que -m gateway.server funciona desde cualquier directorio.)
Vale para uso personal en el que confías en que el agente usa las tools porque son el camino natural para lo que le pides, no porque no tenga forma de saltárselas.
Opción B — servicio systemd bajo usuario separado (aislamiento real)
scripts/setup_service.sh despliega el gateway bajo un usuario Unix
dedicado (jira-gw, sin login), con el .env en /opt/jira-gateway/.env
(modo 600, propiedad de jira-gw) — tu usuario normal no puede leerlo ni
por cat ni por ninguna otra vía, porque no tiene permisos de sistema
sobre esos ficheros. El gateway corre como servicio (streamable-http) y
Claude Code se conecta por red, sin ver el token en ningún momento:
sudo bash scripts/setup_service.sh
Y en la config de Claude Code, sin credenciales:
{
"mcpServers": {
"jira-gateway": {
"type": "http",
"url": "http://127.0.0.1:8765/mcp"
}
}
}
Es más montaje (usuario de sistema, systemd, redeploy con el script cuando cambies código), pero es la única de las dos opciones donde "el agente no puede leer el token" es una garantía técnica y no solo una expectativa de buen comportamiento.
Flujo de uso
- "¿Qué tareas tengo pendientes?" →
list_my_tasks - "Crea una tarea para X" →
create_task(sinconfirm) → el agente te enseña el preview (proyecto, tipo, resumen, descripción, etiquetas) → si dices que sí, el agente vuelve a llamar acreate_taskconconfirm=Truey los mismos datos → ahí sí se crea. Aceptalabelsopcional (lista de strings) para etiquetar el issue al crearlo. - "Selecciona la PROJ-123 para desarrollo" →
start_taskconstatus="Selected for Development"(o el nombre exacto de la transición intermedia de tu workflow). - "Empieza la PROJ-123" →
start_tasksinstatus→ transiciona al estado de "en progreso" configurado enJIRA_IN_PROGRESS_STATUS. - Claude Code crea la rama, desarrolla, comitea y hace push con sus
herramientas normales de bash/git — el gateway no interviene en nada de
esto, y puede seguir leyendo
git log/git diff/git blamesin restricción alguna. - Tú abres el PR a mano cuando toque.
Nota sobre la confirmación: además del preview de create_task, Claude Code
ya te pide aprobación antes de ejecutar cualquier llamada a un MCP no
auto-aprobado (verás el JSON de parámetros antes de que se dispare). El
preview de create_task es una capa extra pensada para que la revisión sea
legible (texto formateado) en vez de JSON crudo — como cuando revisas el
mensaje de un commit antes de confirmarlo.
Por qué está diseñado así
- Catálogo cerrado de tools: solo 2 acciones, ambas de Jira, ninguna toca git. No hay "ejecuta este comando" genérico ni JQL libre.
- Git queda fuera a propósito: ya confías en Claude Code para manejar git por bash (commits, push, y también lectura de historial cuando lo necesitas), así que el gateway no intenta duplicar ni restringir eso — solo cubre lo que el agente no puede hacer solo, que es hablar con Jira sin ver tu token.
- Validación de issue_key (
PROJ-123) antes de tocar Jira. create_tasknunca escribe en la primera llamada: el flagconfirmempieza enFalsepor defecto, así que la ruta "segura" (preview) es la que sale sin que nadie tenga que acordarse de pedirla explícitamente.start_tasksolo transiciona issues asignados a ti: comprueba elassigneecontra el usuario del token antes de tocar nada. Si el issue es de otra persona (o está sin asignar), falla sin transicionar. Esto no aplica a la transición automática decreate_taskaJIRA_SELECTED_STATUS, ya que un issue recién creado normalmente está aún sin asignar.
Notas
- No he podido instalar/testear
mcpen el entorno donde escribí esto (sin red). Antes de usarlo en serio, pásalo por tu Claude Code local para que compile, corrapip install -e .y valide el import — probablemente haga falta algún ajuste menor de API si tu versión demcpdifiere. - El scope de token recomendado: clásico
write:jira-work+read:jira-work(los granulares de escritura tienen un bug conocido en POST a fecha de hoy — ver conversación anterior).
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。