mcp-sesrver

cloudbro-draupnir/mcp-sesrver

3.2

If you are the rightful owner of mcp-sesrver and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.

Draupnir MCP Server is a static MCP server designed for Cilium-based Zero Trust configurations, offering tools and prompts for Cilium Network Policy management.

Tools
9
Resources
0
Prompts
0

Draupnir MCP Server (Cilium Zeroโ€‘Trust edition)

๋ชฉํ‘œ: Cilium ๊ธฐ๋ฐ˜ Zero Trust ๋ ˆํผ๋Ÿฐ์Šค(์˜ˆ: Draupnir)์˜ ๊ตฌ์„ฑ์„ ๋‹ค๋ฃจ๋Š” ์ •์  MCP ์„œ๋ฒ„. data/ ํด๋”์˜ YAML/MD/์ฝ”๋“œ๋“ค์„ ๋ฆฌ์†Œ์Šค๋กœ ๋…ธ์ถœํ•˜๊ณ , Cilium ๋„คํŠธ์›Œํฌ ์ •์ฑ…(CNP/CCNP)์„ ์œ„ํ•œ ๊ฒ€์ฆ/ํ…œํ”Œ๋ฆฟ/์ฒดํฌ๋ฆฌ์ŠคํŠธ/ํ—ˆ๋ธ” ํ•„ํ„ฐ ์ƒ์„ฑ ํˆด๊ณผ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ œ๊ณต.

Quick start (uv)

uv python install 3.12
uv sync

# ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ
mkdir -p data && echo "apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-dns
spec:
  endpointSelector: {}
  egress:
  - toEndpoints:
    - matchLabels: {k8s:io.kubernetes.pod.namespace: kube-system}
    toPorts:
    - ports: [{ port: \"53\", protocol: UDP }]
" > data/allow-dns.yaml

# stdio ์‹คํ–‰
uv run draupnir-mcp-server

Draupnir ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ

๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

A) ZIP ๊ธฐ๋ฐ˜ (๊ถŒ์žฅ: ๋น ๋ฅด๊ฒŒ ์‹œ๋„ํ•  ๋•Œ)

# ZIP ์ง€์ • (์˜ˆ: /mnt/data/draupnir-main.zip)
make import ZIP=/absolute/path/to/draupnir.zip
# ๋˜๋Š”
uv run cnp-ingest --zip /absolute/path/to/draupnir.zip --dest data

B) Git submodule ๊ธฐ๋ฐ˜ (๊ถŒ์žฅ: ์—…์ŠคํŠธ๋ฆผ์„ ์ง€์† ์ถ”์ ํ•  ๋•Œ)

# ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ
make submodule-add SUBMODULE_URL=https://github.com/cloudbro-draupnir/draupnir.git SUBMODULE_PATH=vendor/draupnir
# ์ตœ์‹  ๋ฐ˜์˜
make submodule-update SUBMODULE_PATH=vendor/draupnir
# ์ •์ฑ…/์ƒ˜ํ”Œ์„ data/์— ๋™๊ธฐํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (ํ•„์š” ์‹œ rsync ๋“ฑ ํ›„์ฒ˜๋ฆฌ ์ถ”๊ฐ€)
#   rsync -av vendor/draupnir/policies/ data/policies/

ZIP์€ ๊ฐ„ํŽธํ•จ, ์„œ๋ธŒ๋ชจ๋“ˆ์€ ์žฅ๊ธฐ ์œ ์ง€/๋™๊ธฐํ™”์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ๋ฒ•์„ ํ˜ผ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ • ์˜ˆ์‹œ (Claude Desktop)

~/Library/Application Support/Claude/mcp.json:

{
  "mcpServers": {
    "draupnir-mcp-server": {
      "command": "uv",
      "args": ["run", "draupnir-mcp-server"],
      "env": { "STATIC_MCP_DATA_DIR": "${HOME}/path/to/project/data" }
    }
  }
}

์ œ๊ณต ๊ธฐ๋Šฅ

  • Resources: data/์˜ ํŒŒ์ผ๋“ค์„ file:// URI๋กœ ๋…ธ์ถœ
  • Tools
    • list_files(pattern)
    • read_text(path) / search_text(query, glob)
    • healthcheck()
    • list_cilium_policies(glob) โ€” CNP/CCNP๋งŒ ํ•„ํ„ฐ๋ง
    • validate_cilium_policy(path) โ€” ํ•„์ˆ˜ ํ•„๋“œ/์•ˆ์ „์„ฑ ๊ฒฝ๊ณ 
    • generate_policy_template(app, namespace, ...) โ€” Zeroโ€‘Trust ํ…œํ”Œ๋ฆฟ
    • hubble_filters(src, dst, verdict) โ€” ํ—ˆ๋ธ” ๊ด€์ธก ์Šค๋‹ˆํŽซ
    • zero_trust_checklist(glob) โ€” ZT posture ์š”์•ฝ
  • Prompts
    • hardening-review โ€” ํ•˜๋“œ๋‹ ๋ฆฌ๋ทฐ ๊ฐ€์ด๋“œ
    • write-cilium-policy โ€” ์‹ ๊ทœ ์„œ๋น„์Šค ์ •์ฑ… ํ…œํ”Œ๋ฆฟ

๋Œ€์‹œ๋ณด๋“œ/๊ฐ€์ด๋“œ ์ฐธ๊ณ 

  • Grafana: Cilium Policy Verdicts (ID 18015)
  • Isovalent Labs: Cilium Zeroโ€‘Trust Visibility

HTTP/SSE ๋ชจ๋“œ (์˜ต์…˜)

uv run draupnir-mcp-server --http 0.0.0.0:8765

Streamlit UI (์˜ต์…˜)

make setup          # ensure deps
make ui             # launches Streamlit at http://localhost:8501

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ STATIC_MCP_DATA_DIR๋ฅผ UI ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์„ค์ •/๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Makefile

์ž๋™ํ™” ํƒ€๊นƒ ํฌํ•จ: setup, run, run-http, lint, import, submodule-add, submodule-update, sample, client-config, package, clean

Kubernetes ํ†ตํ•ฉ

.kube/config๊ฐ€ ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ๊ณ , kubectl config use-context <CTX>๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ์ „ํ™˜ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

MCP ํˆด

  • k8s_context() : ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ํ™•์ธ
  • k8s_cluster_info() : kubectl cluster-info + kubectl get nodes -o wide
  • k8s_service_accounts(all_namespaces=True) : kubectl get sa -A -o json ์š”์•ฝ

Make ํƒ€๊นƒ (kubectl ์ „์ œ)

make kctx CONTEXT=gke_reflecting-surf-472800-e7_asia-northeast2-a_cluster2   # ์ปจํ…์ŠคํŠธ ์ „ํ™˜
make kinfo                                                                  # cluster-info + nodes
make ksa                                                                    # SA ์š”์•ฝ (์ „ ๋„ค์ž„์ŠคํŽ˜์ด์Šค)
# (์˜ต์…˜) Hubble CLI๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด
make kverdicts VERDICT=DROPPED DURATION=30s                                 # ์ตœ๊ทผ verdict ๊ด€์ธก

Developer Examples

Quick dev usage (direct import):

export STATIC_MCP_DATA_DIR=data
python - <<'PY'
from draupnir_mcp_server import server
print(server.list_files("**/*.yaml")[:3])
print(server.validate_cilium_policy("allow-dns.yaml")["warnings"])
PY

Template test example (pytest):

def test_my_tool(tmp_path, monkeypatch):
    import os, importlib
    os.environ["STATIC_MCP_DATA_DIR"] = str(tmp_path / "data")
    (tmp_path / "data").mkdir(parents=True, exist_ok=True)
    server = importlib.reload(importlib.import_module("draupnir_mcp_server.server"))
    # result = server.my_tool(...)
    # assert result == expected

Contributing

  • Contributor guide: see AGENTS.md for project structure, commands, style, and examples.
  • Examples: see โ€œMCP Tools & Examplesโ€ and โ€œTesting Guidelinesโ€ sections in AGENTS.md.