| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import json
- import os
- import subprocess
- from pathlib import Path
- import pytest
- ROOT = Path(__file__).resolve().parents[2]
- COMPOSE = ROOT / "deploy/docker/docker-compose.yml"
- pytestmark = pytest.mark.skipif(
- os.getenv("KESTRA_INTEGRATION") != "1",
- reason="set KESTRA_INTEGRATION=1 for the local Kestra MCP contract",
- )
- def test_kestra_mcp_stdio_initializes_and_exposes_only_governed_groups():
- messages = [
- {
- "jsonrpc": "2.0",
- "id": 1,
- "method": "initialize",
- "params": {
- "protocolVersion": "2025-06-18",
- "capabilities": {},
- "clientInfo": {"name": "dataops-v51", "version": "1.0"},
- },
- },
- {
- "jsonrpc": "2.0",
- "method": "notifications/initialized",
- "params": {},
- },
- {"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}},
- ]
- payload = "\n".join(
- json.dumps(message, separators=(",", ":")) for message in messages
- ) + "\n"
- result = subprocess.run(
- [
- "docker",
- "compose",
- "-f",
- str(COMPOSE),
- "--profile",
- "kestra-mcp",
- "run",
- "--rm",
- "-T",
- "--no-deps",
- "kestra-mcp",
- ],
- cwd=ROOT,
- input=payload,
- check=True,
- capture_output=True,
- text=True,
- timeout=60,
- )
- responses = {
- item["id"]: item
- for line in result.stdout.splitlines()
- if line.strip()
- for item in [json.loads(line)]
- if "id" in item
- }
- assert responses[1]["result"]["serverInfo"]["name"]
- tools = responses[2]["result"]["tools"]
- assert tools
- names = {tool["name"] for tool in tools}
- assert any("flow" in name for name in names)
- assert any("execution" in name for name in names)
- for forbidden in ("namespace_file", "kv_", "tenant", "auditlog"):
- assert not any(forbidden in name for name in names)
|