Skip to content

Commit b41c116

Browse files
committed
Initial commit: YouTrack Rocket MCP Server v0.4.0
Features: - FastMCP-based implementation with proper parameter schemas - 19 MCP tools for YouTrack integration - Issue management (create, view, comment, search) - Project management and custom fields support - Advanced search with filters - User management - Comprehensive search syntax guide - Docker support - MCP Inspector integration Technical: - Python 3.12+ with async/await - Pydantic models for validation - Field type caching for performance - Automatic retry logic with exponential backoff - Support for both YouTrack Cloud and self-hosted instances - Comprehensive test suite (38 tests passing) - Type hints with Annotated for parameter descriptions
1 parent d2a5b7b commit b41c116

37 files changed

Lines changed: 6319 additions & 0 deletions

.dockerignore

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Git
2+
.git
3+
.gitignore
4+
5+
# Python
6+
__pycache__/
7+
*.py[cod]
8+
*$py.class
9+
*.so
10+
.Python
11+
build/
12+
develop-eggs/
13+
dist/
14+
downloads/
15+
eggs/
16+
.eggs/
17+
lib/
18+
lib64/
19+
parts/
20+
sdist/
21+
var/
22+
*.egg-info/
23+
.installed.cfg
24+
*.egg
25+
.pytest_cache/
26+
.coverage
27+
htmlcov/
28+
.tox/
29+
.coverage.*
30+
.cache/
31+
nosetests.xml
32+
coverage.xml
33+
*,cover
34+
.mypy_cache/
35+
.ruff_cache/
36+
37+
# Virtual environments
38+
venv/
39+
ENV/
40+
env/
41+
.venv/
42+
43+
# UV
44+
uv.lock
45+
.python-version
46+
47+
# IDE
48+
.idea/
49+
.vscode/
50+
*.swp
51+
*.swo
52+
.cursor/
53+
.qoder/
54+
55+
# Environment files
56+
.env
57+
.env.*
58+
!.env.example
59+
60+
# Docker
61+
Dockerfile
62+
docker-compose.yml
63+
.dockerignore
64+
65+
# Documentation
66+
docs/
67+
68+
# Tests
69+
tests/
70+
test_*.py
71+
72+
# MCP config files
73+
.cursor/mcp.json
74+
.vscode/mcp.json

.env.example

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# YouTrack MCP Configuration
2+
# Copy this file to .env and fill in your values
3+
4+
# Required: Your YouTrack instance URL
5+
YOUTRACK_URL=https://your-instance.youtrack.cloud
6+
7+
# Required: Your YouTrack API token
8+
# For cloud instances, use format: perm:xxx-xxx-xxx
9+
# For self-hosted, use the token directly
10+
YOUTRACK_API_TOKEN=perm:your-api-token
11+
12+
# Optional: Set to true for YouTrack Cloud instances (auto-detected if not set)
13+
# YOUTRACK_CLOUD=true
14+
15+
# Optional: SSL certificate verification (default: true)
16+
# Set to false only for self-hosted instances with self-signed certificates
17+
# YOUTRACK_VERIFY_SSL=true
18+
19+
# Optional: Enable debug logging (default: false)
20+
# MCP_DEBUG=false

.gitignore

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Environment variables and API tokens
2+
.env
3+
.env.backup
4+
.env.local
5+
.env.*.local
6+
.cursorrules
7+
.cursor/
8+
9+
# Python
10+
__pycache__/
11+
*.py[cod]
12+
*$py.class
13+
*.so
14+
.Python
15+
16+
# UV
17+
uv.lock
18+
env/
19+
build/
20+
develop-eggs/
21+
dist/
22+
downloads/
23+
eggs/
24+
.eggs/
25+
lib/
26+
lib64/
27+
parts/
28+
sdist/
29+
var/
30+
wheels/
31+
*.egg-info/
32+
.installed.cfg
33+
*.egg
34+
35+
# Virtual environments
36+
.venv/
37+
venv/
38+
venv_test/
39+
ENV/
40+
env/
41+
42+
# IDE files
43+
.idea/
44+
.vscode/*
45+
.vscode/mcp.json.example
46+
*.swp
47+
*.swo
48+
.DS_Store
49+
50+
# Test files
51+
.coverage
52+
htmlcov/
53+
.pytest_cache/
54+
.tox/
55+
56+
# Logs
57+
*.log
58+
logs/
59+
60+
# Development files
61+
plan.md
62+
IMPLEMENTATION_STATUS.md
63+
todo.md
64+
integration_tests/
65+
.python-version
66+
CLAUDE.md
67+
.claude/
68+
.qoder/

.pre-commit-config.yaml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# See https://pre-commit.com for more information
2+
# See https://pre-commit.com/hooks.html for more hooks
3+
repos:
4+
# Local hooks that use uv
5+
- repo: local
6+
hooks:
7+
# Ruff linter and formatter via uv
8+
- id: ruff-lint
9+
name: ruff (lint)
10+
entry: uv run ruff check
11+
language: system
12+
types: [python]
13+
args: [--fix]
14+
require_serial: true
15+
16+
- id: ruff-format
17+
name: ruff (format)
18+
entry: uv run ruff format
19+
language: system
20+
types: [python]
21+
require_serial: true
22+
23+
# MyPy via uv
24+
- id: mypy
25+
name: mypy (type check)
26+
entry: uv run mypy
27+
language: system
28+
types: [python]
29+
pass_filenames: false
30+
args: [youtrack_mcp]
31+
require_serial: true
32+
33+
# General hooks
34+
- repo: https://github.com/pre-commit/pre-commit-hooks
35+
rev: v5.0.0
36+
hooks:
37+
- id: trailing-whitespace
38+
name: Trim trailing whitespace
39+
- id: end-of-file-fixer
40+
name: Fix end of files
41+
- id: check-yaml
42+
name: Check YAML syntax
43+
- id: check-added-large-files
44+
args: [--maxkb=500]
45+
name: Check for large files (>500KB)
46+
- id: check-merge-conflict
47+
name: Check for merge conflicts
48+
- id: check-toml
49+
name: Check TOML syntax
50+
- id: debug-statements
51+
name: Check for debugger imports
52+
- id: mixed-line-ending
53+
args: [--fix=lf]
54+
name: Fix mixed line endings
55+
56+
# Check for secrets
57+
- repo: https://github.com/Yelp/detect-secrets
58+
rev: v1.5.0
59+
hooks:
60+
- id: detect-secrets
61+
args: [--baseline, .secrets.baseline]
62+
exclude: ^(tests/|\.secrets\.baseline)$
63+
name: Detect secrets
64+
65+
# Configuration
66+
default_language_version:
67+
python: python3.12
68+
69+
# Run on all files by default
70+
files: ''
71+
exclude: '^(\.git|\.venv|venv|build|dist|\.egg|\.pytest_cache|__pycache__|htmlcov|\.coverage|\.mypy_cache|\.ruff_cache)/'
72+
73+
# Fail fast on first error
74+
fail_fast: false
75+
76+
# Default stages
77+
default_stages: [pre-commit]

.secrets.baseline

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
{
2+
"version": "1.5.0",
3+
"plugins_used": [
4+
{
5+
"name": "ArtifactoryDetector"
6+
},
7+
{
8+
"name": "AWSKeyDetector"
9+
},
10+
{
11+
"name": "AzureStorageKeyDetector"
12+
},
13+
{
14+
"name": "Base64HighEntropyString",
15+
"limit": 4.5
16+
},
17+
{
18+
"name": "BasicAuthDetector"
19+
},
20+
{
21+
"name": "CloudantDetector"
22+
},
23+
{
24+
"name": "DiscordBotTokenDetector"
25+
},
26+
{
27+
"name": "GitHubTokenDetector"
28+
},
29+
{
30+
"name": "GitLabTokenDetector"
31+
},
32+
{
33+
"name": "HexHighEntropyString",
34+
"limit": 3.0
35+
},
36+
{
37+
"name": "IbmCloudIamDetector"
38+
},
39+
{
40+
"name": "IbmCosHmacDetector"
41+
},
42+
{
43+
"name": "IPPublicDetector"
44+
},
45+
{
46+
"name": "JwtTokenDetector"
47+
},
48+
{
49+
"name": "KeywordDetector",
50+
"keyword_exclude": ""
51+
},
52+
{
53+
"name": "MailchimpDetector"
54+
},
55+
{
56+
"name": "NpmDetector"
57+
},
58+
{
59+
"name": "OpenAIDetector"
60+
},
61+
{
62+
"name": "PrivateKeyDetector"
63+
},
64+
{
65+
"name": "PypiTokenDetector"
66+
},
67+
{
68+
"name": "SendGridDetector"
69+
},
70+
{
71+
"name": "SlackDetector"
72+
},
73+
{
74+
"name": "SoftlayerDetector"
75+
},
76+
{
77+
"name": "SquareOAuthDetector"
78+
},
79+
{
80+
"name": "StripeDetector"
81+
},
82+
{
83+
"name": "TelegramBotTokenDetector"
84+
},
85+
{
86+
"name": "TwilioKeyDetector"
87+
}
88+
],
89+
"filters_used": [
90+
{
91+
"path": "detect_secrets.filters.allowlist.is_line_allowlisted"
92+
},
93+
{
94+
"path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
95+
"min_level": 2
96+
},
97+
{
98+
"path": "detect_secrets.filters.heuristic.is_indirect_reference"
99+
},
100+
{
101+
"path": "detect_secrets.filters.heuristic.is_likely_id_string"
102+
},
103+
{
104+
"path": "detect_secrets.filters.heuristic.is_lock_file"
105+
},
106+
{
107+
"path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
108+
},
109+
{
110+
"path": "detect_secrets.filters.heuristic.is_potential_uuid"
111+
},
112+
{
113+
"path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
114+
},
115+
{
116+
"path": "detect_secrets.filters.heuristic.is_sequential_string"
117+
},
118+
{
119+
"path": "detect_secrets.filters.heuristic.is_swagger_file"
120+
},
121+
{
122+
"path": "detect_secrets.filters.heuristic.is_templated_secret"
123+
}
124+
],
125+
"results": {},
126+
"generated_at": "2025-09-04T09:23:18Z"
127+
}

0 commit comments

Comments
 (0)