Kurd MCP
Kurd is a high-performance Model Context Protocol (MCP) gateway for Python, powered by Rust.
The Rust data plane handles HTTP serving, JSON-RPC dispatch, tool routing, upstream aggregation, caching, retries, circuit breaking, backpressure, rate limiting, and Prometheus metrics. The Python layer provides the developer API — tool registration, runtime configuration, and an optional enterprise feature set.
Targets MCP protocol revision 2026-07-28. Fully typed (PEP 561).
Contents
- Installation
- Quick Start
- CLI
- Registering Tools
- Mounting Upstream Servers
- Runtime Configuration
- Security
- Observability
- MCP Protocol Compliance
- Enterprise Features
- Performance
- Architecture
- Development
- Project Structure
- License
Installation
pip install kurd
Requires Python 3.10+ and a 64-bit platform. Pre-built wheels are available for Windows, Linux (x86-64, aarch64), and macOS (x86-64, Apple Silicon).
Quick Start
from kurd import Router
from kurd._kurd import start_http_gateway
router = Router()
@router.tool()
async def add(a: int, b: int) -> int:
"""Add two integers."""
return a + b
# Blocks until stop_http_gateway() is called or the process exits.
start_http_gateway("0.0.0.0:9200")
The gateway starts three endpoints:
| Path | Method | Purpose |
|---|---|---|
/mcp |
POST |
JSON-RPC 2.0 MCP endpoint |
/health |
GET |
Liveness probe — returns 200 OK |
/status |
GET |
Runtime, cache, upstream, and circuit-breaker snapshot |
/metrics |
GET |
Prometheus metrics |
Call the gateway:
curl -s http://localhost:9200/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"add","arguments":{"a":3,"b":4}}}'
{"jsonrpc":"2.0","id":1,"result":{"resultType":"complete","content":[{"type":"text","text":"7"}],"isError":false}}
CLI
Kurd ships a kurd command installed alongside the package.
Usage: kurd <COMMAND>
Commands:
serve Start the HTTP MCP gateway
Options:
-h, --help Show this message and exit
kurd serve
kurd serve [--host HOST] [--port PORT] [--token TOKEN]
| Flag | Default | Description |
|---|---|---|
--host |
0.0.0.0 |
Bind address |
--port |
8000 |
Bind port |
--token |
— | Bearer token for authentication (overrides KURD_AUTH_TOKEN) |
# Start on port 8000 with no authentication
kurd serve
# Start on a specific address with a bearer token
kurd serve --host 127.0.0.1 --port 9200 --token my-secret
# Use an environment variable for the token
KURD_AUTH_TOKEN=my-secret kurd serve --port 9200
Registering Tools
Decorator API
from kurd import Router
router = Router()
@router.tool()
async def search(query: str, limit: int = 10) -> list[str]:
"""Search the knowledge base."""
return [f"result {i}" for i in range(limit)]
Type annotations are converted to a JSON Schema inputSchema automatically:
| Python type | JSON Schema type |
|---|---|
int |
integer |
float |
number |
bool |
boolean |
str |
string |
list[T] |
array with item schema |
dict |
object |
Optional[T] / T | None |
schema of T |
Parameters with defaults become optional; parameters without defaults are added to required.
Hot-reloading
Replace a tool's implementation at runtime without restarting the gateway:
router.reload_tool("search", new_search_function)
Unregistering
router.unregister_tool("search")
Introspection
router.list_tools() # -> ["add", "search", ...]
router.list_upstreams() # -> [("github", "http://..."), ...]
Mounting Upstream Servers
Kurd aggregates remote MCP servers alongside local tools.
router.mount("github", "http://github-mcp.internal:9300")
router.mount("jira", "http://jira-mcp.internal:9300")
Upstream tools are prefixed with the upstream name:
github.create_issue
jira.create_ticket
Clients discover all tools — local and upstream — through a single tools/list call. Kurd fetches remote tool lists concurrently, caches them with a configurable TTL, and follows pagination automatically.
Unmounting and cache invalidation
router.unmount("github") # stop routing to this upstream
router.refresh_tools() # expire the tool list cache immediately
Upstream behaviour
- Connection pool: persistent HTTP/1.1 connections via Reqwest
- Retry: up to 3 attempts with exponential backoff + jitter
- Circuit breaker: opens after 5 consecutive failures; resets after 30 s
- Timeout: configurable per
RuntimeConfig.upstream_timeout_ms - Private-network policy: loopback/private URLs blocked by default unless
set_allow_private_upstreams(True)is called
Runtime Configuration
All gateway tunables are collected in RuntimeConfig:
from kurd import Router, RuntimeConfig
router = Router()
router.configure_runtime(RuntimeConfig(
# Concurrency
global_concurrency = 512, # max simultaneous in-flight requests
upstream_concurrency = 64, # max simultaneous upstream calls
python_concurrency = 64, # max simultaneous Python tool calls
upstream_timeout_ms = 30_000,
# Logging
request_logging = False, # structured per-request log lines
# Rate limiting
rate_limiting_enabled = True,
rate_limit_per_ip_rps = 1_000,
rate_limit_global_rps = 10_000,
# IP allowlist (None = allow all)
ip_allowlist = ["192.168.1.0/24", "10.0.0.1"],
# Tool cache
tools_cache_ttl_ms = 30_000,
# Enterprise (all off by default)
enable_dlq = False,
enable_idempotency = False,
secrets_backend = "env",
enable_webhooks = False,
enable_distributed_state = False,
distributed_state_backend = "memory",
redis_url = "redis://localhost:6379/0",
enable_distributed_tracing = False,
))
configure_runtime also accepts keyword arguments directly for ergonomic one-liners:
router.configure_runtime(request_logging=True, rate_limiting_enabled=True)
Runtime status
status = router.runtime_status()
# {
# "global_active": 3,
# "global_limit": 512,
# "python_active": 1,
# "upstream_metrics": {...},
# "cache": {"hits": 142, "misses": 3},
# ...
# }
Security
Bearer token authentication
Set a bearer token before starting the gateway. Requests missing or carrying a wrong token receive 401 Unauthorized.
from kurd._kurd import set_http_bearer_token, clear_http_bearer_token
set_http_bearer_token("my-production-token")
# clear_http_bearer_token() # disable authentication
Via environment variable (loaded automatically at gateway start):
KURD_AUTH_TOKEN=my-production-token kurd serve
Tokens are compared with a constant-time byte comparison to prevent timing attacks.
IP allowlist
from kurd import set_ip_allowlist, clear_ip_allowlist
set_ip_allowlist(["10.0.0.1", "10.0.0.2"])
clear_ip_allowlist() # allow all IPs again
Or through RuntimeConfig.ip_allowlist. Blocked IPs receive 403 Forbidden.
Rate limiting
router.configure_runtime(
rate_limiting_enabled=True,
rate_limit_per_ip_rps=1_000,
rate_limit_global_rps=10_000,
)
Rate-limited requests receive 429 Too Many Requests with a Retry-After: 1 header and a retryAfterMs field in the JSON-RPC error body.
Additional safeguards
| Safeguard | Details |
|---|---|
| Request size cap | 1 MiB hard limit; 413 on excess |
| Content-type validation | Must be application/json; -32600 otherwise |
| Upstream URL validation | Rejects credentials, fragments, and unsupported schemes |
| Private-network policy | Upstream calls to loopback/RFC1918 blocked by default |
| CORS | OPTIONS /mcp returns correct preflight headers; POST responses include Access-Control-Allow-Origin: * |
| Overload rejection | 503 when global concurrency limit is reached |
For internet-facing deployments, terminate TLS at a reverse proxy (nginx, Caddy, AWS ALB) and apply network-level controls there.
Observability
Structured logging
Enable per-request log lines (goes to stdout in the format chosen by KURD_LOG):
router.configure_runtime(request_logging=True)
Control log verbosity via environment variable:
KURD_LOG=kurd=debug kurd serve # debug, info, warn, error
RUST_LOG=info kurd serve # fallback if KURD_LOG is unset
Log level can also be changed at runtime via the logging/setLevel MCP method.
Prometheus metrics
curl http://localhost:9200/metrics
| Metric | Type | Description |
|---|---|---|
kurd_requests_total{status} |
counter | Total requests by status (total, completed, rejected) |
kurd_requests_active |
gauge | In-flight requests right now |
kurd_requests_peak_active |
gauge | Highest concurrent request count since startup |
kurd_request_latency_ms |
gauge | Rolling average latency (ms) |
kurd_request_latency_histogram_ms_bucket{le} |
histogram | Latency distribution (1ms … 5000ms + Inf) |
kurd_request_latency_histogram_ms_count |
counter | Total completed requests counted in histogram |
kurd_request_latency_histogram_ms_sum |
counter | Total latency (ms) summed across all requests |
kurd_python_active_calls |
gauge | Active Python tool invocations |
kurd_python_peak_active_calls |
gauge | Peak simultaneous Python tool invocations |
kurd_python_rejections_total |
counter | Python tool calls dropped due to concurrency limit |
kurd_upstream_requests_total{upstream} |
counter | Requests forwarded per upstream |
kurd_upstream_successes_total{upstream} |
counter | Successful upstream calls |
kurd_upstream_failures_total{upstream} |
counter | Failed upstream calls |
kurd_upstream_retries_total{upstream} |
counter | Retry attempts per upstream |
kurd_upstream_latency_ms{upstream} |
gauge | Average upstream round-trip latency |
kurd_upstream_circuit_breaker_state{upstream} |
gauge | 0 = closed, 1 = open |
kurd_upstream_active_calls{upstream} |
gauge | Current in-flight calls per upstream |
kurd_upstream_peak_active_calls{upstream} |
gauge | Peak in-flight calls per upstream |
kurd_upstream_rejections_total |
counter | Upstream calls dropped due to concurrency limit |
kurd_cache_hits_total |
counter | Tool-list cache hits |
kurd_cache_misses_total |
counter | Tool-list cache misses |
kurd_cache_invalidations_total |
counter | Cache invalidations (manual or TTL expiry) |
kurd_concurrency_limit{type} |
gauge | Configured limits: global, upstream, python |
Prometheus scrape config
# prometheus.yml
scrape_configs:
- job_name: kurd
static_configs:
- targets: ["localhost:9200"]
metrics_path: /metrics
scrape_interval: 15s
Datadog
# datadog.yaml
instances:
- openmetrics_endpoint: http://localhost:9200/metrics
namespace: kurd
metrics: ["kurd_.*"]
OpenTelemetry
from kurd.telemetry import setup_otel, OTELConfig
setup_otel(OTELConfig(
service_name = "my-gateway",
otlp_endpoint = "http://otel-collector:4317",
sample_rate = 1.0,
))
OTELConfig.service_version defaults to the installed kurd package version automatically.
Health checks
from kurd.health_checks import HealthCheckManager
hc = HealthCheckManager()
# Register a custom check
async def check_db():
...
hc.register_check("database", check_db, critical=True)
# Kubernetes probes
readiness = await hc.check_readiness() # all critical checks pass
liveness = await hc.check_liveness() # process is running and active
MCP Protocol Compliance
Kurd implements the MCP 2026-07-28 protocol revision.
Supported methods
| Method | Behaviour |
|---|---|
initialize |
Returns protocolVersion, capabilities, and serverInfo |
ping |
Returns {} |
server/discover |
Returns capabilities, supported versions, and server identity |
tools/list |
Aggregates local + upstream tools; supports cursor-based pagination |
tools/call |
Routes to local Python tool or upstream server |
resources/list |
Returns empty list with ttlMs and cacheScope |
resources/read |
Returns {"contents": []} |
prompts/list |
Returns empty list with ttlMs and cacheScope |
prompts/get |
Returns -32602 (gateway holds no prompts) |
completion/complete |
Returns {"values": [], "hasMore": false} |
logging/setLevel |
Applies log level to the tracing filter at runtime |
notifications/* |
Accepted silently — returns 202 Accepted with empty body |
Modern HTTP headers
When a client sends Mcp-Protocol-Version: 2026-07-28, Kurd additionally validates:
Mcp-Methodheader matches the JSON-RPCmethodfieldMcp-Nameheader matchesparams.namefortools/call
Mismatched headers return -32020. Unsupported protocol versions return -32019.
Enterprise Features
Enable features through RuntimeConfig or by importing the relevant manager class directly.
Multi-tenancy
from kurd.multitenancy import TenantManager
manager = TenantManager()
api_key = manager.add_tenant(
tenant_id="acme",
name="Acme Corp",
quota_rps=100,
allowed_tools=["add", "search"],
)
Each tenant receives a unique API key. Quotas and tool ACLs are enforced independently.
Billing
from kurd.billing import BillingManager
billing = BillingManager()
billing.set_pricing({"add": {"per_call": 0.001, "per_latency_ms": 0.0001}})
billing.track_call(tenant_id="acme", tool_name="add", latency_ms=12.5, success=True)
report = billing.get_usage_report("acme", period="2026-08")
Supported models: per-request, per-latency, tiered, hybrid.
Request idempotency
router.configure_runtime(enable_idempotency=True)
mgr = router.get_idempotency()
is_dup, cached = mgr.check_idempotent_key("req-abc-123", tenant_id="acme")
if is_dup:
return cached
result = run_tool()
mgr.store_result("req-abc-123", "acme", result)
Backed by SQLite with a 24-hour TTL.
Dead-letter queue
router.configure_runtime(enable_dlq=True, dlq_storage_path="/data/kurd/dlq")
dlq = router.get_dlq()
dlq.add_message(request_id="req-123", tenant_id="acme",
tool_name="add", arguments={"a":1,"b":2}, error="timeout")
dlq.register_replay_handler("add", handler)
success, error = dlq.replay_message("dlq_abc123")
stats = dlq.get_statistics(tenant_id="acme")
dlq.cleanup_archived(days=30)
Replay uses exponential backoff up to 1 hour.
Secrets management
from kurd.secrets_management import SecretsManager
# Kubernetes in-cluster | HashiCorp Vault | AWS Secrets Manager | env (default)
manager = SecretsManager(backend="vault",
vault_addr="https://vault.example.com",
vault_token="s.xxxxx")
secret = manager.get_secret("db_password")
Third-party dependencies (kubernetes, hvac, boto3) are imported lazily — only when the matching backend is activated.
Webhooks
router.configure_runtime(enable_webhooks=True)
hooks = router.get_webhooks()
hooks.register_webhook(
url="https://example.com/hooks",
events=["error", "rate_limit_exceeded"],
tenant_id="acme",
)
Deliveries are HMAC-SHA256 signed and logged for audit via get_deliveries().
Distributed state
router.configure_runtime(
enable_distributed_state=True,
distributed_state_backend="redis",
redis_url="redis://localhost:6379/0",
)
state = router.get_distributed_state()
state.set("gateway:version", 42)
state.increment("counters:acme:calls")
Use backend="memory" for single-instance deployments.
Distributed tracing
from kurd.distributed_tracing import extract_context
trace = extract_context(incoming_headers)
span = trace.create_span("tool_execution", {"tool": "add"})
span.set_attribute("result", 42)
span.end()
Follows W3C Trace Context. Tracing state is available in router.runtime_status() when enabled.
Performance
Benchmarks from a Windows development machine (Python 3.12, release build):
| Scenario | Concurrency | Throughput | p50 | p95 | p99 | Errors |
|---|---|---|---|---|---|---|
| Local Python tool | 10 | 594.5 req/s | 14.9 ms | 23.9 ms | 28.7 ms | 0% |
| Local Python tool | 50 | 587.9 req/s | 33.3 ms | 87.8 ms | 119.1 ms | 0% |
| Local Python tool | 100 | 556.0 req/s | 18.3 ms | 29.5 ms | 32.4 ms | 0% |
| Upstream tool | 10 | 412.2 req/s | 21.8 ms | 36.4 ms | 42.7 ms | 0% |
| Upstream tool | 50 | 229.8 req/s | 20.6 ms | 534.6 ms | 549.3 ms | 0% |
| Sustained burst | 100 | 573.3 req/s | 73.5 ms | 179.1 ms | 218.5 ms | 0% |
Results depend on hardware, OS, Python version, and network conditions.
python -m pytest tests/test_load.py -q -s
Architecture
Python application
│
▼
kurd.Router ← Python API layer
│
├── Enterprise modules (optional, lazy)
│ multitenancy · billing · idempotency · DLQ
│ secrets · webhooks · distributed state · tracing
│
▼
PyO3 boundary
│
▼
Rust MCP gateway (Axum + Tokio)
│
├── HTTP handler ─────────────────────────────────┐
│ content-type · auth · IP allowlist │
│ rate limiting · concurrency backpressure │
│ CORS · request ID · tracing │
│ │
├── MCP dispatcher │
│ initialize · ping · server/discover │
│ tools/list (paginated) · tools/call │
│ resources · prompts · completion · logging │
│ notifications (202) │
│ │
├── Local Python tools ◄── PyO3 callback │
│ (Rayon-parallel batch parsing) │
│ │
└── Upstream MCP servers │
retry · circuit breaker · cache · metrics ◄┘
The Rust layer holds all mutable gateway state in lock-free atomics and RwLock-guarded maps. Python code never touches the hot path after registration.
Development
Prerequisites
- Rust stable toolchain (
rustup update stable) - Python 3.10+
maturinandpytest
pip install maturin pytest
Build
# Development build (fast iteration)
maturin develop
# Optimised build (benchmarks, pre-release testing)
maturin develop --release
# Release wheel
maturin build --release
Test
python -m pytest -q
The test suite covers:
- JSON-RPC parsing and fast batch parsing (Rayon)
- Local sync and async tools
initializehandshake and lifecycle methodstools/listpaginationcompletion/complete,notifications/202, CORS preflight- Upstream discovery, routing, and concurrency
- Circuit breaker, retry, and timeout behaviour
- Tool-list cache hits, misses, and invalidation
- Bearer authentication (accepted and rejected)
- IP allowlist enforcement
- Rate-limit rejection and
Retry-Afterheader - Request-size and content-type guards
- Prometheus metrics output
- Load and burst behaviour
Linting
cargo check
cargo clippy -- -D warnings
Environment variables
| Variable | Purpose |
|---|---|
KURD_AUTH_TOKEN |
Bearer token loaded automatically at gateway start |
KURD_LOG |
Tracing filter (e.g. kurd=debug). Takes precedence over RUST_LOG |
RUST_LOG |
Standard Rust log filter fallback |
Project Structure
kurd-mcp/
├── kurd/
│ ├── __init__.py # Public API + __version__
│ ├── py.typed # PEP 561 marker
│ ├── cli.py # `kurd serve` entry point
│ ├── router.py # Router class + RuntimeConfig
│ ├── telemetry.py # OpenTelemetry integration
│ ├── health_checks.py # Readiness and liveness probes
│ ├── authorization.py # RBAC helpers
│ ├── multitenancy.py
│ ├── billing.py
│ ├── idempotency.py
│ ├── dead_letter_queue.py
│ ├── secrets_management.py
│ ├── webhooks.py
│ ├── distributed_state.py
│ ├── distributed_tracing.py
│ └── ...
├── src/
│ └── lib.rs # Rust data plane (~2600 lines)
├── tests/
│ ├── test_core.py
│ ├── test_http_gateway.py # Integration tests (module-scoped gateway)
│ ├── test_upstream.py
│ ├── test_load.py
│ ├── test_prometheus_metrics.py
│ └── upstream_server.py # In-process upstream fixture
├── Cargo.toml
├── pyproject.toml
├── LICENSE
└── README.md
Contributing
Issues and pull requests are welcome via the GitHub repository.
Before submitting:
cargo check
cargo clippy -- -D warnings
maturin develop --release
python -m pytest -q
Please open an issue before starting large changes.
License
MIT — Copyright © 2024 Semko Kermashani
The name Kurd honors Kurdish identity and heritage. Bezhi Kurd u Kurdistan.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kurd-0.6.0.tar.gz.
File metadata
- Download URL: kurd-0.6.0.tar.gz
- Upload date:
- Size: 120.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
31d1f01989324076f7d3d119f71098fac7fb2b4e34271f4bc2eb3215297c9653
|
|
| MD5 |
6d88261c1ba241bb3bc5d2499c31ce08
|
|
| BLAKE2b-256 |
5e34ac86631ea67e2374965cb6b6585024262eae2b0634bcb9aa908d569bd3f9
|
Provenance
The following attestation bundles were made for kurd-0.6.0.tar.gz:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0.tar.gz -
Subject digest:
31d1f01989324076f7d3d119f71098fac7fb2b4e34271f4bc2eb3215297c9653 - Sigstore transparency entry: 2620020503
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: kurd-0.6.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 2.5 MB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6da46a49c0eb75da17b938389f4b0c4db5c72951f84b9d4001a8de4795c04ff6
|
|
| MD5 |
7c0ed048a84960fe22d21c55ff0e225f
|
|
| BLAKE2b-256 |
14bd5ceb5cd3c0815c4c802b3aa835f60f7d28ca6bf1d8a2424d055afebfad6c
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp313-cp313-win_amd64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp313-cp313-win_amd64.whl -
Subject digest:
6da46a49c0eb75da17b938389f4b0c4db5c72951f84b9d4001a8de4795c04ff6 - Sigstore transparency entry: 2620020982
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: kurd-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.13, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4257e1674c27c149d54145937fcf37df96f7c259c989bcb003cdcc4131e75a87
|
|
| MD5 |
83ae83ff562f673aa9fb61409d870a25
|
|
| BLAKE2b-256 |
545b6140abbfd224e179c5cbed17317d33e73a14726c9d3c7a32316f9897e847
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl -
Subject digest:
4257e1674c27c149d54145937fcf37df96f7c259c989bcb003cdcc4131e75a87 - Sigstore transparency entry: 2620021478
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: kurd-0.6.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.6 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da0ee6ef302335dbe55002bc9961ba012f1def04c3672971fc9fc522b77c9813
|
|
| MD5 |
1b9ae6542c80615170e2cec9bfe8e8e9
|
|
| BLAKE2b-256 |
a2936eb8db2ee0a85c8f8c69dca988869ef2b3919d32d28f362aaded29782203
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp313-cp313-macosx_11_0_arm64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp313-cp313-macosx_11_0_arm64.whl -
Subject digest:
da0ee6ef302335dbe55002bc9961ba012f1def04c3672971fc9fc522b77c9813 - Sigstore transparency entry: 2620021174
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: kurd-0.6.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 2.5 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ab50aeaddc3f2806cb7f4f53c96e6bca504b2635e622c0c50d28a9b93388358
|
|
| MD5 |
294246f2b964b533f43b92ad06491a30
|
|
| BLAKE2b-256 |
5f7be134218cfc7fba74ab3f777d76f5df05ce08940a485a620166ebf208acd9
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp312-cp312-win_amd64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp312-cp312-win_amd64.whl -
Subject digest:
5ab50aeaddc3f2806cb7f4f53c96e6bca504b2635e622c0c50d28a9b93388358 - Sigstore transparency entry: 2620023040
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: kurd-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.12, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29e8ca011d550dd06f88b685d19984e2d812d24204fdd6fb21dcf21a2f205fb0
|
|
| MD5 |
6d59911c681938fdb468a5c56658b7ff
|
|
| BLAKE2b-256 |
dea73b9fa98ec7a3603681524b3bea4c98e8dc1e95f3e6678ed41fae1adfd314
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl -
Subject digest:
29e8ca011d550dd06f88b685d19984e2d812d24204fdd6fb21dcf21a2f205fb0 - Sigstore transparency entry: 2620022222
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: kurd-0.6.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.6 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e12da70657db84737c23711731731c29b8125412b224ebb6a8c65e0c955365ea
|
|
| MD5 |
6ad01a8e1b13990e542c5085c277c4bb
|
|
| BLAKE2b-256 |
d27ac940cf8b41f383e9b789062b2d7fa99746554aa6ba44cc3a085c742b7165
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp312-cp312-macosx_11_0_arm64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp312-cp312-macosx_11_0_arm64.whl -
Subject digest:
e12da70657db84737c23711731731c29b8125412b224ebb6a8c65e0c955365ea - Sigstore transparency entry: 2620022382
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: kurd-0.6.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 2.5 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc6bead6de1726f4dc181aeb9f3c05f299df250ab0ec42833d7041d2e4944eb6
|
|
| MD5 |
a97d73821ccbe0d6626eb152a14ef84d
|
|
| BLAKE2b-256 |
159356b7872979eebed46c84e0d0e44aa65be18b00bac6470dd0d65a60c1509d
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp311-cp311-win_amd64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp311-cp311-win_amd64.whl -
Subject digest:
dc6bead6de1726f4dc181aeb9f3c05f299df250ab0ec42833d7041d2e4944eb6 - Sigstore transparency entry: 2620021298
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: kurd-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b485ab5e8b332f313e16131017ebd69677baeb4cbec951adb69e4181e2813db2
|
|
| MD5 |
95295e0042a99af65cf18f7a315c3e0a
|
|
| BLAKE2b-256 |
4a3bdec9eb3f22fd2659109cb39e5acd3b2da06e2c7c80935392a6d61125e08e
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl -
Subject digest:
b485ab5e8b332f313e16131017ebd69677baeb4cbec951adb69e4181e2813db2 - Sigstore transparency entry: 2620021697
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: kurd-0.6.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8dc61c00fa7c89c4794a7b5c822666a09da89b6e15bcc5218f1ff9ac7969a7af
|
|
| MD5 |
98d3f5ed6645ccffe71e7d33391e4444
|
|
| BLAKE2b-256 |
6c1c3ba0ae1210d31dfdcb224b5368c1ec773519a80ccfc201031cb84388ccdf
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp311-cp311-macosx_11_0_arm64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp311-cp311-macosx_11_0_arm64.whl -
Subject digest:
8dc61c00fa7c89c4794a7b5c822666a09da89b6e15bcc5218f1ff9ac7969a7af - Sigstore transparency entry: 2620021868
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: kurd-0.6.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 2.5 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e0ea008f676d3e0678f67fe8139d9f04844fddb0647c5c8b174d7bd1f0e35dc
|
|
| MD5 |
f26b0e70d79585aa306eb4768b529ebb
|
|
| BLAKE2b-256 |
040b9a294f01fe2344287690c60ebc12a4f91ece6107c76d6cc69e00f9163326
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp310-cp310-win_amd64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp310-cp310-win_amd64.whl -
Subject digest:
3e0ea008f676d3e0678f67fe8139d9f04844fddb0647c5c8b174d7bd1f0e35dc - Sigstore transparency entry: 2620022803
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: kurd-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d8da703414c42256550d3c2e6de0ba8e09376bee251eb7836648f752b5b7a01
|
|
| MD5 |
069df9c047aba610513fcc209926eb28
|
|
| BLAKE2b-256 |
e9e811d4d02ed749c491d1075f82e840ff35576307ec7c8cf97c2ddf8e2faf18
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl -
Subject digest:
4d8da703414c42256550d3c2e6de0ba8e09376bee251eb7836648f752b5b7a01 - Sigstore transparency entry: 2620022669
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type:
File details
Details for the file kurd-0.6.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: kurd-0.6.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
059675bb4e5f68b7badd3d211fa90591ac9ccfc29b2866311e8ab046b8fac875
|
|
| MD5 |
8fe4cdf7a6a9c86c7fcd1e8336266bf2
|
|
| BLAKE2b-256 |
6995c619b9f20c95815d7a5793166d02f1cdd0e644b136a262d08efcf84fef94
|
Provenance
The following attestation bundles were made for kurd-0.6.0-cp310-cp310-macosx_11_0_arm64.whl:
Publisher:
release.yml on sn391/kurd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
kurd-0.6.0-cp310-cp310-macosx_11_0_arm64.whl -
Subject digest:
059675bb4e5f68b7badd3d211fa90591ac9ccfc29b2866311e8ab046b8fac875 - Sigstore transparency entry: 2620020736
- Sigstore integration time:
-
Permalink:
sn391/kurd@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/sn391
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@67ddaacbd26d64fe932f80ce16f5471e0626822d -
Trigger Event:
push
-
Statement type: