rootly-mcp-server 2.0.15__tar.gz → 2.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rootly_mcp_server-2.1.1/#Dockerfile# +29 -0
- rootly_mcp_server-2.1.1/.beads/.gitignore +44 -0
- rootly_mcp_server-2.1.1/.beads/.local_version +1 -0
- rootly_mcp_server-2.1.1/.beads/.sync.lock +0 -0
- rootly_mcp_server-2.1.1/.beads/README.md +81 -0
- rootly_mcp_server-2.1.1/.beads/beads.db +0 -0
- rootly_mcp_server-2.1.1/.beads/beads.db-shm +0 -0
- rootly_mcp_server-2.1.1/.beads/beads.db-wal +0 -0
- rootly_mcp_server-2.1.1/.beads/config.yaml +62 -0
- rootly_mcp_server-2.1.1/.beads/daemon.lock +7 -0
- rootly_mcp_server-2.1.1/.beads/daemon.pid +1 -0
- rootly_mcp_server-2.1.1/.beads/interactions.jsonl +0 -0
- rootly_mcp_server-2.1.1/.beads/issues.jsonl +6 -0
- rootly_mcp_server-2.1.1/.beads/last-touched +1 -0
- rootly_mcp_server-2.1.1/.beads/metadata.json +4 -0
- rootly_mcp_server-2.1.1/.beads/sync_base.jsonl +5 -0
- rootly_mcp_server-2.1.1/.claude/settings.local.json +77 -0
- rootly_mcp_server-2.1.1/.gitattributes +3 -0
- rootly_mcp_server-2.1.1/.github/dependabot.yml +27 -0
- rootly_mcp_server-2.1.1/.github/workflows/ci.yml +134 -0
- rootly_mcp_server-2.1.1/.github/workflows/lint.yml +31 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/.github/workflows/pypi-release.yml +2 -2
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/.github/workflows/test.yml +5 -5
- rootly_mcp_server-2.1.1/.mcp.json +15 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/.semaphore/deploy.yml +1 -1
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/.semaphore/semaphore.yml +1 -1
- rootly_mcp_server-2.1.1/2026-01-27-MCP.txt +643 -0
- rootly_mcp_server-2.1.1/2026-01-27-claude-code-v2120.txt +1215 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/Dockerfile +1 -1
- rootly_mcp_server-2.0.15/README.md → rootly_mcp_server-2.1.1/PKG-INFO +90 -9
- rootly_mcp_server-2.0.15/PKG-INFO → rootly_mcp_server-2.1.1/README.md +51 -37
- rootly_mcp_server-2.1.1/examples/skills/README.md +130 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/pyproject.toml +103 -6
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/__init__.py +9 -5
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/__main__.py +44 -29
- rootly_mcp_server-2.1.1/src/rootly_mcp_server/client.py +186 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/data/__init__.py +1 -1
- rootly_mcp_server-2.1.1/src/rootly_mcp_server/exceptions.py +148 -0
- rootly_mcp_server-2.1.1/src/rootly_mcp_server/monitoring.py +378 -0
- rootly_mcp_server-2.1.1/src/rootly_mcp_server/pagination.py +98 -0
- rootly_mcp_server-2.1.1/src/rootly_mcp_server/security.py +404 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/server.py +877 -464
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/smart_utils.py +294 -209
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/utils.py +48 -33
- rootly_mcp_server-2.1.1/src/rootly_mcp_server/validators.py +147 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/conftest.py +27 -31
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/integration/local/test_basic.py +50 -47
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/integration/local/test_smart_tools.py +169 -146
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/integration/remote/test_essential.py +98 -92
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/test_client.py +44 -48
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/unit/test_authentication.py +87 -44
- rootly_mcp_server-2.1.1/tests/unit/test_exceptions.py +113 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/unit/test_oncall_handoff.py +10 -11
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/unit/test_oncall_metrics.py +34 -64
- rootly_mcp_server-2.1.1/tests/unit/test_security.py +263 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/unit/test_server.py +102 -77
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/unit/test_smart_utils.py +136 -127
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/unit/test_tools.py +27 -16
- rootly_mcp_server-2.1.1/tests/unit/test_utils.py +145 -0
- rootly_mcp_server-2.1.1/tests/unit/test_validators.py +153 -0
- rootly_mcp_server-2.1.1/uv.lock +2325 -0
- rootly_mcp_server-2.0.15/src/rootly_mcp_server/client.py +0 -132
- rootly_mcp_server-2.0.15/uv.lock +0 -1242
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/.gitignore +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/.semaphore/update-task-definition.sh +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/LICENSE +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/rootly-mcp-server-demo.gif +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/rootly_openapi.json +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/scripts/setup-hooks.sh +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/src/rootly_mcp_server/texttest.json +0 -0
- {rootly_mcp_server-2.0.15 → rootly_mcp_server-2.1.1}/tests/README.md +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Use Python 3.12 slim image as base
|
|
2
|
+
FROM python:3.14-slim
|
|
3
|
+
|
|
4
|
+
# Set working directory
|
|
5
|
+
WORKDIR /app
|
|
6
|
+
|
|
7
|
+
# Install system dependencies
|
|
8
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
9
|
+
gcc curl ca-certificates \
|
|
10
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
11
|
+
|
|
12
|
+
# Install uv
|
|
13
|
+
RUN pip install --no-cache-dir uv
|
|
14
|
+
|
|
15
|
+
# Copy the entire project first for installation
|
|
16
|
+
COPY . .
|
|
17
|
+
|
|
18
|
+
# Install the package and its dependencies
|
|
19
|
+
RUN uv pip install --system --no-cache-dir -e .
|
|
20
|
+
|
|
21
|
+
# Expose the port the app runs on
|
|
22
|
+
EXPOSE 8000
|
|
23
|
+
|
|
24
|
+
# Set environment variables
|
|
25
|
+
ENV PYTHONUNBUFFERED=1
|
|
26
|
+
ENV
|
|
27
|
+
|
|
28
|
+
# Run the application
|
|
29
|
+
CMD ["rootly-mcp-server", "--transport", "sse", "--log-level", "INFO", "--hosted"]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# SQLite databases
|
|
2
|
+
*.db
|
|
3
|
+
*.db?*
|
|
4
|
+
*.db-journal
|
|
5
|
+
*.db-wal
|
|
6
|
+
*.db-shm
|
|
7
|
+
|
|
8
|
+
# Daemon runtime files
|
|
9
|
+
daemon.lock
|
|
10
|
+
daemon.log
|
|
11
|
+
daemon.pid
|
|
12
|
+
bd.sock
|
|
13
|
+
sync-state.json
|
|
14
|
+
last-touched
|
|
15
|
+
|
|
16
|
+
# Local version tracking (prevents upgrade notification spam after git ops)
|
|
17
|
+
.local_version
|
|
18
|
+
|
|
19
|
+
# Legacy database files
|
|
20
|
+
db.sqlite
|
|
21
|
+
bd.db
|
|
22
|
+
|
|
23
|
+
# Worktree redirect file (contains relative path to main repo's .beads/)
|
|
24
|
+
# Must not be committed as paths would be wrong in other clones
|
|
25
|
+
redirect
|
|
26
|
+
|
|
27
|
+
# Merge artifacts (temporary files from 3-way merge)
|
|
28
|
+
beads.base.jsonl
|
|
29
|
+
beads.base.meta.json
|
|
30
|
+
beads.left.jsonl
|
|
31
|
+
beads.left.meta.json
|
|
32
|
+
beads.right.jsonl
|
|
33
|
+
beads.right.meta.json
|
|
34
|
+
|
|
35
|
+
# Sync state (local-only, per-machine)
|
|
36
|
+
# These files are machine-specific and should not be shared across clones
|
|
37
|
+
.sync.lock
|
|
38
|
+
sync_base.jsonl
|
|
39
|
+
|
|
40
|
+
# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
|
|
41
|
+
# They would override fork protection in .git/info/exclude, allowing
|
|
42
|
+
# contributors to accidentally commit upstream issue databases.
|
|
43
|
+
# The JSONL files (issues.jsonl, interactions.jsonl) and config files
|
|
44
|
+
# are tracked by git by default since no pattern above ignores them.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.47.1
|
|
File without changes
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Beads - AI-Native Issue Tracking
|
|
2
|
+
|
|
3
|
+
Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
|
|
4
|
+
|
|
5
|
+
## What is Beads?
|
|
6
|
+
|
|
7
|
+
Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
|
|
8
|
+
|
|
9
|
+
**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Essential Commands
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Create new issues
|
|
17
|
+
bd create "Add user authentication"
|
|
18
|
+
|
|
19
|
+
# View all issues
|
|
20
|
+
bd list
|
|
21
|
+
|
|
22
|
+
# View issue details
|
|
23
|
+
bd show <issue-id>
|
|
24
|
+
|
|
25
|
+
# Update issue status
|
|
26
|
+
bd update <issue-id> --status in_progress
|
|
27
|
+
bd update <issue-id> --status done
|
|
28
|
+
|
|
29
|
+
# Sync with git remote
|
|
30
|
+
bd sync
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Working with Issues
|
|
34
|
+
|
|
35
|
+
Issues in Beads are:
|
|
36
|
+
- **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
|
|
37
|
+
- **AI-friendly**: CLI-first design works perfectly with AI coding agents
|
|
38
|
+
- **Branch-aware**: Issues can follow your branch workflow
|
|
39
|
+
- **Always in sync**: Auto-syncs with your commits
|
|
40
|
+
|
|
41
|
+
## Why Beads?
|
|
42
|
+
|
|
43
|
+
✨ **AI-Native Design**
|
|
44
|
+
- Built specifically for AI-assisted development workflows
|
|
45
|
+
- CLI-first interface works seamlessly with AI coding agents
|
|
46
|
+
- No context switching to web UIs
|
|
47
|
+
|
|
48
|
+
🚀 **Developer Focused**
|
|
49
|
+
- Issues live in your repo, right next to your code
|
|
50
|
+
- Works offline, syncs when you push
|
|
51
|
+
- Fast, lightweight, and stays out of your way
|
|
52
|
+
|
|
53
|
+
🔧 **Git Integration**
|
|
54
|
+
- Automatic sync with git commits
|
|
55
|
+
- Branch-aware issue tracking
|
|
56
|
+
- Intelligent JSONL merge resolution
|
|
57
|
+
|
|
58
|
+
## Get Started with Beads
|
|
59
|
+
|
|
60
|
+
Try Beads in your own projects:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Install Beads
|
|
64
|
+
curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
|
|
65
|
+
|
|
66
|
+
# Initialize in your repo
|
|
67
|
+
bd init
|
|
68
|
+
|
|
69
|
+
# Create your first issue
|
|
70
|
+
bd create "Try out Beads"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Learn More
|
|
74
|
+
|
|
75
|
+
- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
|
|
76
|
+
- **Quick Start Guide**: Run `bd quickstart`
|
|
77
|
+
- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
*Beads: Issue tracking that moves at the speed of thought* ⚡
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Beads Configuration File
|
|
2
|
+
# This file configures default behavior for all bd commands in this repository
|
|
3
|
+
# All settings can also be set via environment variables (BD_* prefix)
|
|
4
|
+
# or overridden with command-line flags
|
|
5
|
+
|
|
6
|
+
# Issue prefix for this repository (used by bd init)
|
|
7
|
+
# If not set, bd init will auto-detect from directory name
|
|
8
|
+
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
|
|
9
|
+
# issue-prefix: ""
|
|
10
|
+
|
|
11
|
+
# Use no-db mode: load from JSONL, no SQLite, write back after each command
|
|
12
|
+
# When true, bd will use .beads/issues.jsonl as the source of truth
|
|
13
|
+
# instead of SQLite database
|
|
14
|
+
# no-db: false
|
|
15
|
+
|
|
16
|
+
# Disable daemon for RPC communication (forces direct database access)
|
|
17
|
+
# no-daemon: false
|
|
18
|
+
|
|
19
|
+
# Disable auto-flush of database to JSONL after mutations
|
|
20
|
+
# no-auto-flush: false
|
|
21
|
+
|
|
22
|
+
# Disable auto-import from JSONL when it's newer than database
|
|
23
|
+
# no-auto-import: false
|
|
24
|
+
|
|
25
|
+
# Enable JSON output by default
|
|
26
|
+
# json: false
|
|
27
|
+
|
|
28
|
+
# Default actor for audit trails (overridden by BD_ACTOR or --actor)
|
|
29
|
+
# actor: ""
|
|
30
|
+
|
|
31
|
+
# Path to database (overridden by BEADS_DB or --db)
|
|
32
|
+
# db: ""
|
|
33
|
+
|
|
34
|
+
# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)
|
|
35
|
+
# auto-start-daemon: true
|
|
36
|
+
|
|
37
|
+
# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)
|
|
38
|
+
# flush-debounce: "5s"
|
|
39
|
+
|
|
40
|
+
# Git branch for beads commits (bd sync will commit to this branch)
|
|
41
|
+
# IMPORTANT: Set this for team projects so all clones use the same sync branch.
|
|
42
|
+
# This setting persists across clones (unlike database config which is gitignored).
|
|
43
|
+
# Can also use BEADS_SYNC_BRANCH env var for local override.
|
|
44
|
+
# If not set, bd sync will require you to run 'bd config set sync.branch <branch>'.
|
|
45
|
+
# sync-branch: "beads-sync"
|
|
46
|
+
|
|
47
|
+
# Multi-repo configuration (experimental - bd-307)
|
|
48
|
+
# Allows hydrating from multiple repositories and routing writes to the correct JSONL
|
|
49
|
+
# repos:
|
|
50
|
+
# primary: "." # Primary repo (where this database lives)
|
|
51
|
+
# additional: # Additional repos to hydrate from (read-only)
|
|
52
|
+
# - ~/beads-planning # Personal planning repo
|
|
53
|
+
# - ~/work-planning # Work planning repo
|
|
54
|
+
|
|
55
|
+
# Integration settings (access with 'bd config get/set')
|
|
56
|
+
# These are stored in the database, not in this file:
|
|
57
|
+
# - jira.url
|
|
58
|
+
# - jira.project
|
|
59
|
+
# - linear.url
|
|
60
|
+
# - linear.api-key
|
|
61
|
+
# - github.org
|
|
62
|
+
# - github.repo
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
33545
|
|
File without changes
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{"id":"Rootly-MCP-server-50c","title":"Implement comprehensive MCP server improvements (6-stage plan)","description":"Execute the comprehensive 6-stage improvement plan for the Rootly MCP server.\n\n**Plan Location**: /Users/sylvainkalache/.claude/plans/velvet-gathering-meerkat.md\n\n**Overview**:\n- Stage 1: Critical Security Fixes (Week 1)\n- Stage 2: Error Handling Refactoring (Week 2)\n- Stage 3: Code Complexity Reduction (Weeks 3-4)\n- Stage 4: Comprehensive Test Coverage (Week 5)\n- Stage 5: MCP Protocol Compliance (Week 6)\n- Stage 6: Code Simplification \u0026 Documentation (Weeks 7-8)\n\n**Key Outcomes**:\n- Zero security vulnerabilities\n- \u003e80% test coverage\n- All functions \u003c50 lines\n- Full MCP protocol compliance\n- Zero breaking changes\n\n**Dependencies**:\nThis bead blocks:\n- Rootly-MCP-server-jds (traceback exposure)\n- Rootly-MCP-server-561 (token logging)\n- Rootly-MCP-server-a8z (output schemas)\n- Rootly-MCP-server-b2d (request cancellation)\n- Rootly-MCP-server-9tl (prompt definitions)\n\n**Timeline**: 6-8 weeks\n**Estimated Effort**: 1-2 developers\n\nSee plan file for complete details, tradeoffs, and implementation strategy.","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:42:19.916971-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:42:19.916971-05:00"}
|
|
2
|
+
{"id":"Rootly-MCP-server-561","title":"Stop logging API token prefixes","description":"Debug output logs first 5 characters of API token (line 116 in server.py), which is sensitive information that should never be logged.\n\n**Impact**: HIGH - security/compliance concern\n**Files**: src/rootly_mcp_server/server.py (line 116)\n\n**Security issue**:\n- Even partial token exposure is a security risk\n- Violates security best practices and compliance requirements\n\n**Acceptance criteria**:\n- Remove all token logging\n- Replace with simple 'Token validated' message\n- Audit codebase for other sensitive data in logs","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:39.25723-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:39.25723-05:00"}
|
|
3
|
+
{"id":"Rootly-MCP-server-9tl","title":"Add prompt definitions for incident workflows","description":"Server is tool-only with no prompt definitions. Adding domain-specific prompts would improve usability for common incident management workflows.\n\n**Impact**: Medium - feature enhancement, protocol compliance\n**Files**: src/rootly_mcp_server/server.py (new @mcp.prompt() definitions)\n\n**Missing prompts**:\n- 'incident-triage' - structured incident analysis\n- 'oncall-handoff' - shift handoff template \n- 'incident-postmortem' - retrospective analysis\n\n**Acceptance criteria**:\n- Define 3 domain-specific prompts\n- Follow MCP prompt specification\n- Include appropriate arguments and templates","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:39.949723-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:39.949723-05:00"}
|
|
4
|
+
{"id":"Rootly-MCP-server-a8z","title":"Add output schemas to MCP tools","description":"Tools currently return dicts but don't declare their response structure in schema form. This makes it harder for clients to understand what data to expect.\n\n**Impact**: Medium - improves client integration\n**Files**: src/rootly_mcp_server/server.py (custom tools at lines 1124-1136, etc.)\n\n**Details from review**:\n- 7 custom tools need output schemas defined\n- search_incidents(), find_related_incidents(), suggest_solutions(), etc.\n- Should use MCP OutputSchema specification\n\n**Acceptance criteria**:\n- All custom tools have defined output schemas\n- Schemas match actual response structure\n- Follow MCP protocol specifications","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:38.503711-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:38.503711-05:00"}
|
|
5
|
+
{"id":"Rootly-MCP-server-b2d","title":"Implement request cancellation support","description":"Tools don't support MCP's request cancellation protocol, which prevents clients from canceling long-running operations.\n\n**Impact**: Medium - protocol compliance and UX\n**Files**: src/rootly_mcp_server/server.py (all tool implementations)\n\n**MCP protocol gap**:\n- No cancellation handlers implemented\n- Long-running tools (search_incidents, find_related_incidents) can't be canceled\n- Affects client responsiveness\n\n**Acceptance criteria**:\n- Add cancellation support to all async tools\n- Handle cancellation gracefully\n- Follow MCP cancellation protocol specification","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:39.596691-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:39.596691-05:00"}
|
|
6
|
+
{"id":"Rootly-MCP-server-jds","title":"Remove traceback exposure in error responses","description":"Error handling currently includes full exception tracebacks in error details (lines 1134, 1700 in server.py), which could leak sensitive information.\n\n**Impact**: HIGH - security concern\n**Files**: src/rootly_mcp_server/server.py (lines 1130-1135, 1697-1701)\n\n**Security issue**:\n- Tracebacks may expose file paths, environment details, internal logic\n- Error responses should sanitize exception details for clients\n\n**Acceptance criteria**:\n- Remove traceback from error responses\n- Keep error type and user-friendly message\n- Add proper logging for internal debugging without exposing to clients","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:38.897731-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:38.897731-05:00"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Rootly-MCP-server-50c
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"id":"Rootly-MCP-server-561","title":"Stop logging API token prefixes","description":"Debug output logs first 5 characters of API token (line 116 in server.py), which is sensitive information that should never be logged.\n\n**Impact**: HIGH - security/compliance concern\n**Files**: src/rootly_mcp_server/server.py (line 116)\n\n**Security issue**:\n- Even partial token exposure is a security risk\n- Violates security best practices and compliance requirements\n\n**Acceptance criteria**:\n- Remove all token logging\n- Replace with simple 'Token validated' message\n- Audit codebase for other sensitive data in logs","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:39.25723-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:39.25723-05:00"}
|
|
2
|
+
{"id":"Rootly-MCP-server-9tl","title":"Add prompt definitions for incident workflows","description":"Server is tool-only with no prompt definitions. Adding domain-specific prompts would improve usability for common incident management workflows.\n\n**Impact**: Medium - feature enhancement, protocol compliance\n**Files**: src/rootly_mcp_server/server.py (new @mcp.prompt() definitions)\n\n**Missing prompts**:\n- 'incident-triage' - structured incident analysis\n- 'oncall-handoff' - shift handoff template \n- 'incident-postmortem' - retrospective analysis\n\n**Acceptance criteria**:\n- Define 3 domain-specific prompts\n- Follow MCP prompt specification\n- Include appropriate arguments and templates","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:39.949723-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:39.949723-05:00"}
|
|
3
|
+
{"id":"Rootly-MCP-server-a8z","title":"Add output schemas to MCP tools","description":"Tools currently return dicts but don't declare their response structure in schema form. This makes it harder for clients to understand what data to expect.\n\n**Impact**: Medium - improves client integration\n**Files**: src/rootly_mcp_server/server.py (custom tools at lines 1124-1136, etc.)\n\n**Details from review**:\n- 7 custom tools need output schemas defined\n- search_incidents(), find_related_incidents(), suggest_solutions(), etc.\n- Should use MCP OutputSchema specification\n\n**Acceptance criteria**:\n- All custom tools have defined output schemas\n- Schemas match actual response structure\n- Follow MCP protocol specifications","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:38.503711-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:38.503711-05:00"}
|
|
4
|
+
{"id":"Rootly-MCP-server-b2d","title":"Implement request cancellation support","description":"Tools don't support MCP's request cancellation protocol, which prevents clients from canceling long-running operations.\n\n**Impact**: Medium - protocol compliance and UX\n**Files**: src/rootly_mcp_server/server.py (all tool implementations)\n\n**MCP protocol gap**:\n- No cancellation handlers implemented\n- Long-running tools (search_incidents, find_related_incidents) can't be canceled\n- Affects client responsiveness\n\n**Acceptance criteria**:\n- Add cancellation support to all async tools\n- Handle cancellation gracefully\n- Follow MCP cancellation protocol specification","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:39.596691-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:39.596691-05:00"}
|
|
5
|
+
{"id":"Rootly-MCP-server-jds","title":"Remove traceback exposure in error responses","description":"Error handling currently includes full exception tracebacks in error details (lines 1134, 1700 in server.py), which could leak sensitive information.\n\n**Impact**: HIGH - security concern\n**Files**: src/rootly_mcp_server/server.py (lines 1130-1135, 1697-1701)\n\n**Security issue**:\n- Tracebacks may expose file paths, environment details, internal logic\n- Error responses should sanitize exception details for clients\n\n**Acceptance criteria**:\n- Remove traceback from error responses\n- Keep error type and user-friendly message\n- Add proper logging for internal debugging without exposing to clients","status":"open","priority":2,"issue_type":"task","owner":"sylvain@kalache.fr","created_at":"2026-01-27T18:31:38.897731-05:00","created_by":"Sylvain Kalache","updated_at":"2026-01-27T18:31:38.897731-05:00"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(uv run:*)",
|
|
5
|
+
"Bash(python3:*)",
|
|
6
|
+
"WebFetch(domain:github.com)",
|
|
7
|
+
"WebFetch(domain:raw.githubusercontent.com)",
|
|
8
|
+
"WebFetch(domain:www.aitmpl.com)",
|
|
9
|
+
"Bash(tree:*)",
|
|
10
|
+
"WebSearch",
|
|
11
|
+
"Bash(curl:*)",
|
|
12
|
+
"Bash(gh pr view:*)",
|
|
13
|
+
"Bash(gh pr merge:*)",
|
|
14
|
+
"Bash(git pull:*)",
|
|
15
|
+
"Bash(git add:*)",
|
|
16
|
+
"Bash(git check-ignore:*)",
|
|
17
|
+
"Bash(git commit:*)",
|
|
18
|
+
"Bash(git push:*)",
|
|
19
|
+
"Bash(gh repo fork:*)",
|
|
20
|
+
"Bash(git checkout:*)",
|
|
21
|
+
"Bash(gh pr list:*)",
|
|
22
|
+
"Bash(grep:*)",
|
|
23
|
+
"Bash(ls:*)",
|
|
24
|
+
"Bash(head:*)",
|
|
25
|
+
"Bash(gh pr create:*)",
|
|
26
|
+
"WebFetch(domain:smithery.ai)",
|
|
27
|
+
"WebFetch(domain:skillsmp.com)",
|
|
28
|
+
"WebFetch(domain:skills.sh)",
|
|
29
|
+
"WebFetch(domain:claudemarketplaces.com)",
|
|
30
|
+
"WebFetch(domain:www.claudedirectory.co)",
|
|
31
|
+
"WebFetch(domain:www.atcyrus.com)",
|
|
32
|
+
"Bash(gh pr diff:*)",
|
|
33
|
+
"Skill(beads)",
|
|
34
|
+
"Bash(bd:*)",
|
|
35
|
+
"Bash(sqlite3:*)",
|
|
36
|
+
"Bash(python -m pytest:*)",
|
|
37
|
+
"Bash(find:*)",
|
|
38
|
+
"Bash(export BEADS_DIR=~/.beads)",
|
|
39
|
+
"Bash(xargs:*)",
|
|
40
|
+
"Bash(node:*)",
|
|
41
|
+
"WebFetch(domain:paddo.dev)",
|
|
42
|
+
"Bash(npx:*)",
|
|
43
|
+
"Bash(OPENAI_API_KEY=\"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\" npx -y @mzxrai/mcp-openai@latest)",
|
|
44
|
+
"Bash(claude mcp add --transport stdio mcp-openai --scope local --env OPENAI_API_KEY=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 -- npx -y @mzxrai/mcp-openai@latest)",
|
|
45
|
+
"Bash(claude mcp list:*)",
|
|
46
|
+
"Bash(claude mcp get:*)",
|
|
47
|
+
"Bash(npm install:*)",
|
|
48
|
+
"Bash(OPENAI_API_KEY=\"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\" node review_plan.js /Users/sylvainkalache/Dropbox/work/MCP-servers/Rootly-MCP-server/IMPROVEMENT_PLAN.md)",
|
|
49
|
+
"Bash(python -m black:*)",
|
|
50
|
+
"Bash(.venv/bin/python -m black:*)",
|
|
51
|
+
"Bash(.venv/bin/ruff format:*)",
|
|
52
|
+
"Bash(ROOTLY_API_TOKEN=\"test_token_12345678901234567890\" pytest:*)",
|
|
53
|
+
"Bash(uv pip install:*)",
|
|
54
|
+
"Bash(ROOTLY_API_TOKEN=\"test_token_12345678901234567890\" .venv/bin/pytest:*)",
|
|
55
|
+
"Bash(OPENAI_API_KEY=\"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\" node review_plan.js /Users/sylvainkalache/Dropbox/work/MCP-servers/Rootly-MCP-server/implementation_summary.md)",
|
|
56
|
+
"Bash(OPENAI_API_KEY=\"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\" node review_plan.js implementation_summary.md)",
|
|
57
|
+
"Bash(gh pr checks:*)",
|
|
58
|
+
"Bash(gh run view:*)",
|
|
59
|
+
"Bash(gh pr edit:*)",
|
|
60
|
+
"Bash(gh run list:*)",
|
|
61
|
+
"mcp__mcp-openai__openai_chat",
|
|
62
|
+
"Bash(tee:*)",
|
|
63
|
+
"Bash(git rm:*)",
|
|
64
|
+
"Bash(black:*)",
|
|
65
|
+
"Bash(isort:*)",
|
|
66
|
+
"Bash(python -m isort:*)",
|
|
67
|
+
"Bash(pip install:*)",
|
|
68
|
+
"Bash(gh pr close:*)",
|
|
69
|
+
"Bash(git fetch:*)",
|
|
70
|
+
"Bash(git cherry-pick:*)",
|
|
71
|
+
"Bash(git revert:*)",
|
|
72
|
+
"mcp__rootly__search_incidents",
|
|
73
|
+
"Bash(uv build:*)"
|
|
74
|
+
],
|
|
75
|
+
"deny": []
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
groups:
|
|
8
|
+
actions:
|
|
9
|
+
patterns:
|
|
10
|
+
- "*"
|
|
11
|
+
|
|
12
|
+
- package-ecosystem: "pip"
|
|
13
|
+
directory: "/"
|
|
14
|
+
schedule:
|
|
15
|
+
interval: "weekly"
|
|
16
|
+
open-pull-requests-limit: 10
|
|
17
|
+
groups:
|
|
18
|
+
minor-and-patch:
|
|
19
|
+
applies-to: version-updates
|
|
20
|
+
update-types:
|
|
21
|
+
- "minor"
|
|
22
|
+
- "patch"
|
|
23
|
+
|
|
24
|
+
- package-ecosystem: "docker"
|
|
25
|
+
directory: "/"
|
|
26
|
+
schedule:
|
|
27
|
+
interval: "weekly"
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
name: CI/CD Pipeline
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
strategy:
|
|
14
|
+
matrix:
|
|
15
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout code
|
|
19
|
+
uses: actions/checkout@v6
|
|
20
|
+
|
|
21
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
22
|
+
uses: actions/setup-python@v6
|
|
23
|
+
with:
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
|
|
26
|
+
- name: Install uv
|
|
27
|
+
uses: astral-sh/setup-uv@v7
|
|
28
|
+
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: |
|
|
31
|
+
uv sync --all-extras
|
|
32
|
+
uv pip install --system pytest pytest-cov pytest-asyncio pytest-mock pytest-timeout respx sseclient-py
|
|
33
|
+
|
|
34
|
+
- name: Run tests with pytest
|
|
35
|
+
run: |
|
|
36
|
+
uv run pytest tests/ -v --cov=src/rootly_mcp_server --cov-report=term --cov-report=xml
|
|
37
|
+
|
|
38
|
+
- name: Upload coverage to Codecov
|
|
39
|
+
uses: codecov/codecov-action@v5
|
|
40
|
+
with:
|
|
41
|
+
file: ./coverage.xml
|
|
42
|
+
flags: unittests
|
|
43
|
+
name: codecov-umbrella
|
|
44
|
+
|
|
45
|
+
lint:
|
|
46
|
+
name: Lint
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
|
|
49
|
+
steps:
|
|
50
|
+
- name: Checkout code
|
|
51
|
+
uses: actions/checkout@v6
|
|
52
|
+
|
|
53
|
+
- name: Set up Python
|
|
54
|
+
uses: actions/setup-python@v6
|
|
55
|
+
with:
|
|
56
|
+
python-version: "3.12"
|
|
57
|
+
|
|
58
|
+
- name: Install uv
|
|
59
|
+
uses: astral-sh/setup-uv@v7
|
|
60
|
+
|
|
61
|
+
- name: Install dependencies
|
|
62
|
+
run: |
|
|
63
|
+
uv pip install --system ruff mypy black isort
|
|
64
|
+
|
|
65
|
+
- name: Run ruff
|
|
66
|
+
run: |
|
|
67
|
+
ruff check src/ tests/
|
|
68
|
+
|
|
69
|
+
- name: Run black check
|
|
70
|
+
run: |
|
|
71
|
+
black --check src/ tests/
|
|
72
|
+
|
|
73
|
+
- name: Run isort check
|
|
74
|
+
run: |
|
|
75
|
+
isort --check-only src/ tests/
|
|
76
|
+
|
|
77
|
+
- name: Run mypy
|
|
78
|
+
run: |
|
|
79
|
+
mypy src/rootly_mcp_server --ignore-missing-imports
|
|
80
|
+
continue-on-error: true
|
|
81
|
+
|
|
82
|
+
security:
|
|
83
|
+
name: Security Scan
|
|
84
|
+
runs-on: ubuntu-latest
|
|
85
|
+
|
|
86
|
+
steps:
|
|
87
|
+
- name: Checkout code
|
|
88
|
+
uses: actions/checkout@v6
|
|
89
|
+
|
|
90
|
+
- name: Set up Python
|
|
91
|
+
uses: actions/setup-python@v6
|
|
92
|
+
with:
|
|
93
|
+
python-version: "3.12"
|
|
94
|
+
|
|
95
|
+
- name: Install security tools
|
|
96
|
+
run: |
|
|
97
|
+
pip install bandit safety
|
|
98
|
+
|
|
99
|
+
- name: Run bandit
|
|
100
|
+
run: |
|
|
101
|
+
bandit -r src/ -f json -o bandit-report.json || true
|
|
102
|
+
bandit -r src/
|
|
103
|
+
|
|
104
|
+
- name: Run safety check
|
|
105
|
+
run: |
|
|
106
|
+
safety check --json || true
|
|
107
|
+
continue-on-error: true
|
|
108
|
+
|
|
109
|
+
build:
|
|
110
|
+
name: Build Package
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
needs: [test, lint, security]
|
|
113
|
+
|
|
114
|
+
steps:
|
|
115
|
+
- name: Checkout code
|
|
116
|
+
uses: actions/checkout@v6
|
|
117
|
+
|
|
118
|
+
- name: Set up Python
|
|
119
|
+
uses: actions/setup-python@v6
|
|
120
|
+
with:
|
|
121
|
+
python-version: "3.12"
|
|
122
|
+
|
|
123
|
+
- name: Install uv
|
|
124
|
+
uses: astral-sh/setup-uv@v7
|
|
125
|
+
|
|
126
|
+
- name: Build package
|
|
127
|
+
run: |
|
|
128
|
+
uv build
|
|
129
|
+
|
|
130
|
+
- name: Upload build artifacts
|
|
131
|
+
uses: actions/upload-artifact@v6
|
|
132
|
+
with:
|
|
133
|
+
name: dist
|
|
134
|
+
path: dist/
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Lint and Format
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main, fix/linting-issues ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v6
|
|
15
|
+
|
|
16
|
+
- name: Set up Python
|
|
17
|
+
uses: actions/setup-python@v6
|
|
18
|
+
with:
|
|
19
|
+
python-version: '3.12'
|
|
20
|
+
|
|
21
|
+
- name: Install uv
|
|
22
|
+
run: pip install uv
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: uv sync
|
|
26
|
+
|
|
27
|
+
- name: Run ruff linting
|
|
28
|
+
run: uv run ruff check src/
|
|
29
|
+
|
|
30
|
+
- name: Run ruff format check
|
|
31
|
+
run: uv run ruff format --check src/
|
|
@@ -10,10 +10,10 @@ jobs:
|
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
11
|
steps:
|
|
12
12
|
- name: Checkout code
|
|
13
|
-
uses: actions/checkout@
|
|
13
|
+
uses: actions/checkout@v6
|
|
14
14
|
|
|
15
15
|
- name: Set up Python
|
|
16
|
-
uses: actions/setup-python@
|
|
16
|
+
uses: actions/setup-python@v6
|
|
17
17
|
with:
|
|
18
18
|
python-version: '3.12'
|
|
19
19
|
|
|
@@ -6,8 +6,8 @@ jobs:
|
|
|
6
6
|
local-tests:
|
|
7
7
|
runs-on: ubuntu-latest
|
|
8
8
|
steps:
|
|
9
|
-
- uses: actions/checkout@
|
|
10
|
-
- uses: astral-sh/setup-uv@
|
|
9
|
+
- uses: actions/checkout@v6
|
|
10
|
+
- uses: astral-sh/setup-uv@v7
|
|
11
11
|
- run: uv python install 3.12 && uv sync --dev
|
|
12
12
|
|
|
13
13
|
# Fast local validation
|
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
run: uv run pytest tests/integration/local/ -x
|
|
26
26
|
|
|
27
27
|
- name: Upload coverage
|
|
28
|
-
uses: codecov/codecov-action@
|
|
28
|
+
uses: codecov/codecov-action@v5
|
|
29
29
|
with:
|
|
30
30
|
file: ./coverage.xml
|
|
31
31
|
|
|
@@ -33,8 +33,8 @@ jobs:
|
|
|
33
33
|
runs-on: ubuntu-latest
|
|
34
34
|
needs: local-tests
|
|
35
35
|
steps:
|
|
36
|
-
- uses: actions/checkout@
|
|
37
|
-
- uses: astral-sh/setup-uv@
|
|
36
|
+
- uses: actions/checkout@v6
|
|
37
|
+
- uses: astral-sh/setup-uv@v7
|
|
38
38
|
- run: uv python install 3.12 && uv sync --dev
|
|
39
39
|
|
|
40
40
|
# Build and run the Docker container
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"rootly": {
|
|
4
|
+
"type": "stdio",
|
|
5
|
+
"command": "/Users/sylvainkalache/Dropbox/work/MCP-servers/Rootly-MCP-server/.venv/bin/python",
|
|
6
|
+
"args": [
|
|
7
|
+
"-m",
|
|
8
|
+
"rootly_mcp_server"
|
|
9
|
+
],
|
|
10
|
+
"env": {
|
|
11
|
+
"ROOTLY_API_TOKEN": "rootly_4e4c093c4f888fdc12eeeecafa636dab0621567efa2913789079f3dc3545b2ea"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|