crowdstrike-mcp 4.0.0__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.
- crowdstrike_mcp-4.0.0/.claude/permissions-full.json +14 -0
- crowdstrike_mcp-4.0.0/.claude/permissions-minimal.json +23 -0
- crowdstrike_mcp-4.0.0/.claude/permissions-readonly.json +40 -0
- crowdstrike_mcp-4.0.0/.claude/permissions-standard.json +48 -0
- crowdstrike_mcp-4.0.0/.claude/settings.json +40 -0
- crowdstrike_mcp-4.0.0/.dockerignore +10 -0
- crowdstrike_mcp-4.0.0/.github/dependabot.yml +12 -0
- crowdstrike_mcp-4.0.0/.github/workflows/ci.yml +49 -0
- crowdstrike_mcp-4.0.0/.github/workflows/release.yml +116 -0
- crowdstrike_mcp-4.0.0/.gitignore +27 -0
- crowdstrike_mcp-4.0.0/Dockerfile +8 -0
- crowdstrike_mcp-4.0.0/PKG-INFO +592 -0
- crowdstrike_mcp-4.0.0/README.md +567 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/plans/2026-04-01-falconpy-v1.6.1-upgrade.md +1247 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/plans/2026-04-07-mcp-improvements.md +1449 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/plans/2026-04-09-release-mechanism.md +126 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/plans/2026-04-09-remote-mcp-server.md +1618 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/plans/2026-04-09-response-store.md +1386 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/plans/2026-04-14-mcp-pip-packaging.md +685 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-03-27-mcp-ci-pipeline-design.md +86 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-03-31-cao-hunting-module-design.md +110 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-04-01-falconpy-v1.6.1-upgrade-design.md +149 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-04-07-mcp-improvements-design.md +302 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-04-09-release-mechanism-design.md +55 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-04-09-remote-mcp-server-design.md +430 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-04-09-response-store-design.md +326 -0
- crowdstrike_mcp-4.0.0/docs/superpowers/specs/2026-04-14-mcp-pip-packaging-design.md +193 -0
- crowdstrike_mcp-4.0.0/pyproject.toml +52 -0
- crowdstrike_mcp-4.0.0/ruff.toml +13 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/__init__.py +12 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/_version.py +24 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/client.py +189 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/common/__init__.py +1 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/common/api_scopes.py +82 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/common/auth_middleware.py +39 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/common/errors.py +79 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/common/health.py +33 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/common/session_auth.py +108 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/__init__.py +1 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/alerts.py +844 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/base.py +114 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/cao_hunting.py +449 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/case_management.py +998 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/cloud_registration.py +263 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/cloud_security.py +503 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/correlation.py +659 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/hosts.py +270 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/ngsiem.py +250 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/response.py +348 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/response_store.py +250 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/modules/spotlight.py +80 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/registry.py +94 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/resources/__init__.py +1 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/resources/fql_guides.py +250 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/response_store.py +102 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/server.py +217 -0
- crowdstrike_mcp-4.0.0/src/crowdstrike_mcp/utils.py +307 -0
- crowdstrike_mcp-4.0.0/tests/__init__.py +0 -0
- crowdstrike_mcp-4.0.0/tests/conftest.py +35 -0
- crowdstrike_mcp-4.0.0/tests/test_alerts_endpoint_enrichment.py +98 -0
- crowdstrike_mcp-4.0.0/tests/test_cao_hunting.py +332 -0
- crowdstrike_mcp-4.0.0/tests/test_case_management_new_tools.py +193 -0
- crowdstrike_mcp-4.0.0/tests/test_correlation_import.py +231 -0
- crowdstrike_mcp-4.0.0/tests/test_correlation_templates.py +109 -0
- crowdstrike_mcp-4.0.0/tests/test_endpoint_removed.py +23 -0
- crowdstrike_mcp-4.0.0/tests/test_response_module.py +236 -0
- crowdstrike_mcp-4.0.0/tests/test_smoke_tools_list.py +151 -0
- crowdstrike_mcp-4.0.0/tests/test_spotlight.py +77 -0
- crowdstrike_mcp-4.0.0/tests/test_tool_permissions.py +111 -0
- crowdstrike_mcp-4.0.0/tests/test_version.py +19 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Full access: all tools auto-allowed. Containment and rule changes always prompt. Requires --allow-writes on the server.",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"allow": [
|
|
5
|
+
"mcp__crowdstrike__*"
|
|
6
|
+
],
|
|
7
|
+
"ask": [
|
|
8
|
+
"mcp__crowdstrike__host_contain",
|
|
9
|
+
"mcp__crowdstrike__host_lift_containment",
|
|
10
|
+
"mcp__crowdstrike__correlation_update_rule",
|
|
11
|
+
"mcp__crowdstrike__correlation_import_to_iac"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Minimal: query-only analyst. Only NGSIEM queries and host lookups auto-allowed.",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"allow": [
|
|
5
|
+
"mcp__crowdstrike__ngsiem_query",
|
|
6
|
+
"mcp__crowdstrike__host_lookup"
|
|
7
|
+
],
|
|
8
|
+
"ask": [
|
|
9
|
+
"mcp__crowdstrike__update_alert_status",
|
|
10
|
+
"mcp__crowdstrike__correlation_update_rule",
|
|
11
|
+
"mcp__crowdstrike__correlation_import_to_iac",
|
|
12
|
+
"mcp__crowdstrike__host_contain",
|
|
13
|
+
"mcp__crowdstrike__host_lift_containment",
|
|
14
|
+
"mcp__crowdstrike__case_create",
|
|
15
|
+
"mcp__crowdstrike__case_update",
|
|
16
|
+
"mcp__crowdstrike__case_add_alert_evidence",
|
|
17
|
+
"mcp__crowdstrike__case_add_event_evidence",
|
|
18
|
+
"mcp__crowdstrike__case_add_tags",
|
|
19
|
+
"mcp__crowdstrike__case_delete_tags",
|
|
20
|
+
"mcp__crowdstrike__case_upload_file"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Read-only (default): all read tools auto-allowed, write tools always prompt.",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"allow": [
|
|
5
|
+
"mcp__crowdstrike__get_alerts",
|
|
6
|
+
"mcp__crowdstrike__alert_analysis",
|
|
7
|
+
"mcp__crowdstrike__ngsiem_alert_analysis",
|
|
8
|
+
"mcp__crowdstrike__ngsiem_query",
|
|
9
|
+
"mcp__crowdstrike__host_lookup",
|
|
10
|
+
"mcp__crowdstrike__host_login_history",
|
|
11
|
+
"mcp__crowdstrike__host_network_history",
|
|
12
|
+
"mcp__crowdstrike__correlation_list_rules",
|
|
13
|
+
"mcp__crowdstrike__correlation_get_rule",
|
|
14
|
+
"mcp__crowdstrike__correlation_export_rule",
|
|
15
|
+
"mcp__crowdstrike__case_query",
|
|
16
|
+
"mcp__crowdstrike__case_get",
|
|
17
|
+
"mcp__crowdstrike__case_get_fields",
|
|
18
|
+
"mcp__crowdstrike__cloud_list_accounts",
|
|
19
|
+
"mcp__crowdstrike__cloud_policy_settings",
|
|
20
|
+
"mcp__crowdstrike__cloud_get_risks",
|
|
21
|
+
"mcp__crowdstrike__cloud_get_iom_detections",
|
|
22
|
+
"mcp__crowdstrike__cloud_query_assets",
|
|
23
|
+
"mcp__crowdstrike__cloud_compliance_by_account"
|
|
24
|
+
],
|
|
25
|
+
"ask": [
|
|
26
|
+
"mcp__crowdstrike__update_alert_status",
|
|
27
|
+
"mcp__crowdstrike__correlation_update_rule",
|
|
28
|
+
"mcp__crowdstrike__correlation_import_to_iac",
|
|
29
|
+
"mcp__crowdstrike__host_contain",
|
|
30
|
+
"mcp__crowdstrike__host_lift_containment",
|
|
31
|
+
"mcp__crowdstrike__case_create",
|
|
32
|
+
"mcp__crowdstrike__case_update",
|
|
33
|
+
"mcp__crowdstrike__case_add_alert_evidence",
|
|
34
|
+
"mcp__crowdstrike__case_add_event_evidence",
|
|
35
|
+
"mcp__crowdstrike__case_add_tags",
|
|
36
|
+
"mcp__crowdstrike__case_delete_tags",
|
|
37
|
+
"mcp__crowdstrike__case_upload_file"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Standard SOC analyst: read tools auto-allowed, alert triage auto-allowed, containment and rule changes prompt.",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"allow": [
|
|
5
|
+
"mcp__crowdstrike__get_alerts",
|
|
6
|
+
"mcp__crowdstrike__alert_analysis",
|
|
7
|
+
"mcp__crowdstrike__ngsiem_alert_analysis",
|
|
8
|
+
"mcp__crowdstrike__ngsiem_query",
|
|
9
|
+
"mcp__crowdstrike__host_lookup",
|
|
10
|
+
"mcp__crowdstrike__host_login_history",
|
|
11
|
+
"mcp__crowdstrike__host_network_history",
|
|
12
|
+
"mcp__crowdstrike__correlation_list_rules",
|
|
13
|
+
"mcp__crowdstrike__correlation_get_rule",
|
|
14
|
+
"mcp__crowdstrike__correlation_export_rule",
|
|
15
|
+
"mcp__crowdstrike__case_query",
|
|
16
|
+
"mcp__crowdstrike__case_get",
|
|
17
|
+
"mcp__crowdstrike__case_get_fields",
|
|
18
|
+
"mcp__crowdstrike__cloud_list_accounts",
|
|
19
|
+
"mcp__crowdstrike__cloud_policy_settings",
|
|
20
|
+
"mcp__crowdstrike__cloud_get_risks",
|
|
21
|
+
"mcp__crowdstrike__cloud_get_iom_detections",
|
|
22
|
+
"mcp__crowdstrike__cloud_query_assets",
|
|
23
|
+
"mcp__crowdstrike__cloud_compliance_by_account",
|
|
24
|
+
"mcp__crowdstrike__case_query_access_tags",
|
|
25
|
+
"mcp__crowdstrike__case_get_access_tags",
|
|
26
|
+
"mcp__crowdstrike__case_aggregate_access_tags",
|
|
27
|
+
"mcp__crowdstrike__case_get_rtr_file_metadata",
|
|
28
|
+
"mcp__crowdstrike__case_get_rtr_recent_files",
|
|
29
|
+
"mcp__crowdstrike__correlation_list_templates",
|
|
30
|
+
"mcp__crowdstrike__correlation_get_template",
|
|
31
|
+
"mcp__crowdstrike__spotlight_supported_evaluations",
|
|
32
|
+
"mcp__crowdstrike__update_alert_status",
|
|
33
|
+
"mcp__crowdstrike__case_create",
|
|
34
|
+
"mcp__crowdstrike__case_update",
|
|
35
|
+
"mcp__crowdstrike__case_add_alert_evidence",
|
|
36
|
+
"mcp__crowdstrike__case_add_event_evidence",
|
|
37
|
+
"mcp__crowdstrike__case_add_tags",
|
|
38
|
+
"mcp__crowdstrike__case_delete_tags",
|
|
39
|
+
"mcp__crowdstrike__case_upload_file"
|
|
40
|
+
],
|
|
41
|
+
"ask": [
|
|
42
|
+
"mcp__crowdstrike__host_contain",
|
|
43
|
+
"mcp__crowdstrike__host_lift_containment",
|
|
44
|
+
"mcp__crowdstrike__correlation_update_rule",
|
|
45
|
+
"mcp__crowdstrike__correlation_import_to_iac"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Read-only (default): all read tools auto-allowed, write tools always prompt.",
|
|
3
|
+
"permissions": {
|
|
4
|
+
"allow": [
|
|
5
|
+
"mcp__crowdstrike__get_alerts",
|
|
6
|
+
"mcp__crowdstrike__alert_analysis",
|
|
7
|
+
"mcp__crowdstrike__ngsiem_alert_analysis",
|
|
8
|
+
"mcp__crowdstrike__ngsiem_query",
|
|
9
|
+
"mcp__crowdstrike__host_lookup",
|
|
10
|
+
"mcp__crowdstrike__host_login_history",
|
|
11
|
+
"mcp__crowdstrike__host_network_history",
|
|
12
|
+
"mcp__crowdstrike__correlation_list_rules",
|
|
13
|
+
"mcp__crowdstrike__correlation_get_rule",
|
|
14
|
+
"mcp__crowdstrike__correlation_export_rule",
|
|
15
|
+
"mcp__crowdstrike__case_query",
|
|
16
|
+
"mcp__crowdstrike__case_get",
|
|
17
|
+
"mcp__crowdstrike__case_get_fields",
|
|
18
|
+
"mcp__crowdstrike__cloud_list_accounts",
|
|
19
|
+
"mcp__crowdstrike__cloud_policy_settings",
|
|
20
|
+
"mcp__crowdstrike__cloud_get_risks",
|
|
21
|
+
"mcp__crowdstrike__cloud_get_iom_detections",
|
|
22
|
+
"mcp__crowdstrike__cloud_query_assets",
|
|
23
|
+
"mcp__crowdstrike__cloud_compliance_by_account"
|
|
24
|
+
],
|
|
25
|
+
"ask": [
|
|
26
|
+
"mcp__crowdstrike__update_alert_status",
|
|
27
|
+
"mcp__crowdstrike__correlation_update_rule",
|
|
28
|
+
"mcp__crowdstrike__correlation_import_to_iac",
|
|
29
|
+
"mcp__crowdstrike__host_contain",
|
|
30
|
+
"mcp__crowdstrike__host_lift_containment",
|
|
31
|
+
"mcp__crowdstrike__case_create",
|
|
32
|
+
"mcp__crowdstrike__case_update",
|
|
33
|
+
"mcp__crowdstrike__case_add_alert_evidence",
|
|
34
|
+
"mcp__crowdstrike__case_add_event_evidence",
|
|
35
|
+
"mcp__crowdstrike__case_add_tags",
|
|
36
|
+
"mcp__crowdstrike__case_delete_tags",
|
|
37
|
+
"mcp__crowdstrike__case_upload_file"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# To get started with Dependabot version updates, you'll need to specify which
|
|
2
|
+
# package ecosystems to update and where the package manifests are located.
|
|
3
|
+
# Please see the documentation for all configuration options:
|
|
4
|
+
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
|
|
5
|
+
|
|
6
|
+
version: 2
|
|
7
|
+
updates:
|
|
8
|
+
- package-ecosystem: "" # See documentation for possible values
|
|
9
|
+
directory: "/" # Location of package manifests
|
|
10
|
+
schedule:
|
|
11
|
+
interval: "weekly"
|
|
12
|
+
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [master]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
lint:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.11"
|
|
20
|
+
- name: Install dependencies
|
|
21
|
+
run: pip install -e .[dev]
|
|
22
|
+
- name: Check linting
|
|
23
|
+
run: ruff check src/ tests/ --exclude src/crowdstrike_mcp/_version.py
|
|
24
|
+
- name: Check formatting
|
|
25
|
+
run: ruff format --check src/ tests/ --exclude src/crowdstrike_mcp/_version.py
|
|
26
|
+
|
|
27
|
+
test:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v4
|
|
31
|
+
- uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: "3.11"
|
|
34
|
+
- name: Install dependencies
|
|
35
|
+
run: pip install -e .[dev]
|
|
36
|
+
- name: Run tests
|
|
37
|
+
run: pytest tests/ -v --tb=short
|
|
38
|
+
|
|
39
|
+
smoke:
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v4
|
|
43
|
+
- uses: actions/setup-python@v5
|
|
44
|
+
with:
|
|
45
|
+
python-version: "3.11"
|
|
46
|
+
- name: Install dependencies
|
|
47
|
+
run: pip install -e .[dev]
|
|
48
|
+
- name: Smoke test — tool registration
|
|
49
|
+
run: pytest tests/test_smoke_tools_list.py -v --tb=short
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
packages: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
lint:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
with:
|
|
17
|
+
fetch-depth: 0
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.11"
|
|
21
|
+
- name: Install dependencies
|
|
22
|
+
run: pip install -e .[dev]
|
|
23
|
+
- name: Check linting
|
|
24
|
+
run: ruff check src/ tests/ --exclude src/crowdstrike_mcp/_version.py
|
|
25
|
+
- name: Check formatting
|
|
26
|
+
run: ruff format --check src/ tests/ --exclude src/crowdstrike_mcp/_version.py
|
|
27
|
+
|
|
28
|
+
test:
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
with:
|
|
33
|
+
fetch-depth: 0
|
|
34
|
+
- uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: "3.11"
|
|
37
|
+
- name: Install dependencies
|
|
38
|
+
run: pip install -e .[dev]
|
|
39
|
+
- name: Run tests
|
|
40
|
+
run: pytest tests/ -v --tb=short
|
|
41
|
+
|
|
42
|
+
build:
|
|
43
|
+
needs: [lint, test]
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
with:
|
|
48
|
+
fetch-depth: 0 # hatch-vcs needs full history for version
|
|
49
|
+
- uses: actions/setup-python@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version: "3.12"
|
|
52
|
+
- name: Install build tools
|
|
53
|
+
run: pip install build
|
|
54
|
+
- name: Build sdist and wheel
|
|
55
|
+
run: python -m build
|
|
56
|
+
- name: Verify package version matches tag
|
|
57
|
+
run: |
|
|
58
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
59
|
+
PKG_VERSION=$(python -c "
|
|
60
|
+
import pathlib
|
|
61
|
+
whl = next(pathlib.Path('dist').glob('*.whl'))
|
|
62
|
+
print(whl.name.split('-')[1])
|
|
63
|
+
")
|
|
64
|
+
if [ "$PKG_VERSION" != "$TAG_VERSION" ]; then
|
|
65
|
+
echo "::error::Version mismatch: built package is '$PKG_VERSION' but tag is 'v$TAG_VERSION'"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
echo "Version verified: $TAG_VERSION"
|
|
69
|
+
- uses: actions/upload-artifact@v4
|
|
70
|
+
with:
|
|
71
|
+
name: dist
|
|
72
|
+
path: dist/
|
|
73
|
+
|
|
74
|
+
publish-pypi:
|
|
75
|
+
needs: [build]
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
environment: pypi
|
|
78
|
+
permissions:
|
|
79
|
+
id-token: write # OIDC for trusted publishing
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/download-artifact@v4
|
|
82
|
+
with:
|
|
83
|
+
name: dist
|
|
84
|
+
path: dist/
|
|
85
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
86
|
+
|
|
87
|
+
release:
|
|
88
|
+
needs: [build]
|
|
89
|
+
runs-on: ubuntu-latest
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v4
|
|
92
|
+
|
|
93
|
+
- name: Extract version from tag
|
|
94
|
+
id: version
|
|
95
|
+
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
|
|
96
|
+
|
|
97
|
+
- name: Log in to GHCR
|
|
98
|
+
uses: docker/login-action@v3
|
|
99
|
+
with:
|
|
100
|
+
registry: ghcr.io
|
|
101
|
+
username: ${{ github.actor }}
|
|
102
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
103
|
+
|
|
104
|
+
- name: Build and push Docker image
|
|
105
|
+
uses: docker/build-push-action@v6
|
|
106
|
+
with:
|
|
107
|
+
context: .
|
|
108
|
+
push: true
|
|
109
|
+
tags: |
|
|
110
|
+
ghcr.io/${{ github.repository }}:${{ steps.version.outputs.version }}
|
|
111
|
+
ghcr.io/${{ github.repository }}:latest
|
|
112
|
+
|
|
113
|
+
- name: Create GitHub Release
|
|
114
|
+
run: gh release create "$GITHUB_REF_NAME" --generate-notes
|
|
115
|
+
env:
|
|
116
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Virtual environment
|
|
2
|
+
.venv/
|
|
3
|
+
venv/
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.pyc
|
|
8
|
+
*.pyo
|
|
9
|
+
|
|
10
|
+
# Secrets
|
|
11
|
+
.env
|
|
12
|
+
.env.*
|
|
13
|
+
credentials.json
|
|
14
|
+
|
|
15
|
+
# IDE
|
|
16
|
+
.vscode/
|
|
17
|
+
.idea/
|
|
18
|
+
|
|
19
|
+
# OS
|
|
20
|
+
.DS_Store
|
|
21
|
+
|
|
22
|
+
# Debug/diagnostic utilities
|
|
23
|
+
mcp-debug/
|
|
24
|
+
|
|
25
|
+
# hatch-vcs generated version file
|
|
26
|
+
src/crowdstrike_mcp/_version.py
|
|
27
|
+
dist/
|