agent_os_kernel 3.1.0__py3-none-any.whl
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.
- agent_control_plane/__init__.py +662 -0
- agent_control_plane/a2a_adapter.py +543 -0
- agent_control_plane/adapter.py +417 -0
- agent_control_plane/agent_hibernation.py +394 -0
- agent_control_plane/agent_kernel.py +470 -0
- agent_control_plane/compliance.py +720 -0
- agent_control_plane/constraint_graphs.py +478 -0
- agent_control_plane/control_plane.py +854 -0
- agent_control_plane/example_executors.py +195 -0
- agent_control_plane/execution_engine.py +231 -0
- agent_control_plane/flight_recorder.py +846 -0
- agent_control_plane/governance_layer.py +435 -0
- agent_control_plane/hf_utils.py +563 -0
- agent_control_plane/interfaces/__init__.py +55 -0
- agent_control_plane/interfaces/kernel_interface.py +361 -0
- agent_control_plane/interfaces/plugin_interface.py +497 -0
- agent_control_plane/interfaces/protocol_interfaces.py +387 -0
- agent_control_plane/kernel_space.py +1009 -0
- agent_control_plane/langchain_adapter.py +424 -0
- agent_control_plane/lifecycle.py +3113 -0
- agent_control_plane/mcp_adapter.py +653 -0
- agent_control_plane/ml_safety.py +563 -0
- agent_control_plane/multimodal.py +727 -0
- agent_control_plane/mute_agent.py +422 -0
- agent_control_plane/observability.py +787 -0
- agent_control_plane/orchestrator.py +482 -0
- agent_control_plane/plugin_registry.py +750 -0
- agent_control_plane/policy_engine.py +954 -0
- agent_control_plane/process_isolation.py +777 -0
- agent_control_plane/shadow_mode.py +310 -0
- agent_control_plane/signals.py +493 -0
- agent_control_plane/supervisor_agents.py +430 -0
- agent_control_plane/time_travel_debugger.py +557 -0
- agent_control_plane/tool_registry.py +452 -0
- agent_control_plane/vfs.py +697 -0
- agent_kernel/__init__.py +69 -0
- agent_kernel/analyzer.py +435 -0
- agent_kernel/auditor.py +36 -0
- agent_kernel/completeness_auditor.py +237 -0
- agent_kernel/detector.py +203 -0
- agent_kernel/kernel.py +744 -0
- agent_kernel/memory_manager.py +85 -0
- agent_kernel/models.py +374 -0
- agent_kernel/nudge_mechanism.py +263 -0
- agent_kernel/outcome_analyzer.py +338 -0
- agent_kernel/patcher.py +582 -0
- agent_kernel/semantic_analyzer.py +316 -0
- agent_kernel/semantic_purge.py +349 -0
- agent_kernel/simulator.py +449 -0
- agent_kernel/teacher.py +85 -0
- agent_kernel/triage.py +152 -0
- agent_os/__init__.py +409 -0
- agent_os/_adversarial_impl.py +200 -0
- agent_os/_circuit_breaker_impl.py +232 -0
- agent_os/_mcp_metrics.py +193 -0
- agent_os/adversarial.py +20 -0
- agent_os/agents_compat.py +490 -0
- agent_os/audit_logger.py +135 -0
- agent_os/base_agent.py +651 -0
- agent_os/circuit_breaker.py +34 -0
- agent_os/cli/__init__.py +659 -0
- agent_os/cli/cmd_audit.py +128 -0
- agent_os/cli/cmd_init.py +152 -0
- agent_os/cli/cmd_policy.py +41 -0
- agent_os/cli/cmd_policy_gen.py +180 -0
- agent_os/cli/cmd_validate.py +258 -0
- agent_os/cli/mcp_scan.py +265 -0
- agent_os/cli/output.py +192 -0
- agent_os/cli/policy_checker.py +330 -0
- agent_os/compat.py +74 -0
- agent_os/constraint_graph.py +234 -0
- agent_os/content_governance.py +140 -0
- agent_os/context_budget.py +305 -0
- agent_os/credential_redactor.py +224 -0
- agent_os/diff_policy.py +89 -0
- agent_os/egress_policy.py +159 -0
- agent_os/escalation.py +276 -0
- agent_os/event_bus.py +124 -0
- agent_os/exceptions.py +180 -0
- agent_os/execution_context_policy.py +141 -0
- agent_os/github_enterprise.py +96 -0
- agent_os/health.py +20 -0
- agent_os/integrations/__init__.py +279 -0
- agent_os/integrations/a2a_adapter.py +279 -0
- agent_os/integrations/agent_lightning/__init__.py +30 -0
- agent_os/integrations/anthropic_adapter.py +420 -0
- agent_os/integrations/autogen_adapter.py +620 -0
- agent_os/integrations/base.py +1137 -0
- agent_os/integrations/compat.py +229 -0
- agent_os/integrations/config.py +98 -0
- agent_os/integrations/conversation_guardian.py +957 -0
- agent_os/integrations/crewai_adapter.py +467 -0
- agent_os/integrations/drift_detector.py +425 -0
- agent_os/integrations/dry_run.py +124 -0
- agent_os/integrations/escalation.py +582 -0
- agent_os/integrations/gemini_adapter.py +364 -0
- agent_os/integrations/google_adk_adapter.py +633 -0
- agent_os/integrations/guardrails_adapter.py +394 -0
- agent_os/integrations/health.py +197 -0
- agent_os/integrations/langchain_adapter.py +654 -0
- agent_os/integrations/llamafirewall.py +343 -0
- agent_os/integrations/llamaindex_adapter.py +188 -0
- agent_os/integrations/logging.py +191 -0
- agent_os/integrations/maf_adapter.py +631 -0
- agent_os/integrations/mistral_adapter.py +365 -0
- agent_os/integrations/openai_adapter.py +816 -0
- agent_os/integrations/openai_agents_sdk.py +406 -0
- agent_os/integrations/policy_compose.py +171 -0
- agent_os/integrations/profiling.py +144 -0
- agent_os/integrations/pydantic_ai_adapter.py +420 -0
- agent_os/integrations/rate_limiter.py +130 -0
- agent_os/integrations/rbac.py +143 -0
- agent_os/integrations/registry.py +113 -0
- agent_os/integrations/scope_guard.py +303 -0
- agent_os/integrations/semantic_kernel_adapter.py +769 -0
- agent_os/integrations/smolagents_adapter.py +629 -0
- agent_os/integrations/templates.py +178 -0
- agent_os/integrations/token_budget.py +134 -0
- agent_os/integrations/tool_aliases.py +190 -0
- agent_os/integrations/webhooks.py +177 -0
- agent_os/lite.py +208 -0
- agent_os/mcp_gateway.py +385 -0
- agent_os/mcp_message_signer.py +273 -0
- agent_os/mcp_protocols.py +161 -0
- agent_os/mcp_response_scanner.py +232 -0
- agent_os/mcp_security.py +924 -0
- agent_os/mcp_session_auth.py +231 -0
- agent_os/mcp_sliding_rate_limiter.py +184 -0
- agent_os/memory_guard.py +409 -0
- agent_os/metrics.py +134 -0
- agent_os/mute.py +428 -0
- agent_os/mute_agent.py +209 -0
- agent_os/policies/__init__.py +77 -0
- agent_os/policies/async_evaluator.py +275 -0
- agent_os/policies/backends.py +670 -0
- agent_os/policies/bridge.py +169 -0
- agent_os/policies/budget.py +85 -0
- agent_os/policies/cli.py +294 -0
- agent_os/policies/conflict_resolution.py +270 -0
- agent_os/policies/data_classification.py +252 -0
- agent_os/policies/evaluator.py +239 -0
- agent_os/policies/policy_schema.json +228 -0
- agent_os/policies/rate_limiting.py +145 -0
- agent_os/policies/schema.py +115 -0
- agent_os/policies/shared.py +331 -0
- agent_os/prompt_injection.py +694 -0
- agent_os/providers.py +182 -0
- agent_os/py.typed +0 -0
- agent_os/retry.py +81 -0
- agent_os/reversibility.py +251 -0
- agent_os/sandbox.py +432 -0
- agent_os/sandbox_provider.py +140 -0
- agent_os/secure_codegen.py +525 -0
- agent_os/security_skills.py +538 -0
- agent_os/semantic_policy.py +422 -0
- agent_os/server/__init__.py +15 -0
- agent_os/server/__main__.py +25 -0
- agent_os/server/app.py +277 -0
- agent_os/server/models.py +104 -0
- agent_os/shift_left_metrics.py +130 -0
- agent_os/stateless.py +742 -0
- agent_os/supervisor.py +148 -0
- agent_os/task_outcome.py +148 -0
- agent_os/transparency.py +181 -0
- agent_os/trust_root.py +128 -0
- agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
- agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
- agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
- agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
- agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
- agent_os_observability/__init__.py +27 -0
- agent_os_observability/dashboards.py +898 -0
- agent_os_observability/metrics.py +398 -0
- agent_os_observability/server.py +223 -0
- agent_os_observability/tracer.py +232 -0
- agent_primitives/__init__.py +24 -0
- agent_primitives/failures.py +84 -0
- agent_primitives/py.typed +0 -0
- amb_core/__init__.py +177 -0
- amb_core/adapters/__init__.py +57 -0
- amb_core/adapters/aws_sqs_broker.py +376 -0
- amb_core/adapters/azure_servicebus_broker.py +340 -0
- amb_core/adapters/kafka_broker.py +260 -0
- amb_core/adapters/nats_broker.py +285 -0
- amb_core/adapters/rabbitmq_broker.py +235 -0
- amb_core/adapters/redis_broker.py +262 -0
- amb_core/broker.py +145 -0
- amb_core/bus.py +481 -0
- amb_core/cloudevents.py +509 -0
- amb_core/dlq.py +345 -0
- amb_core/hf_utils.py +536 -0
- amb_core/memory_broker.py +410 -0
- amb_core/models.py +141 -0
- amb_core/persistence.py +529 -0
- amb_core/schema.py +294 -0
- amb_core/tracing.py +358 -0
- atr/__init__.py +640 -0
- atr/access.py +348 -0
- atr/composition.py +645 -0
- atr/decorator.py +357 -0
- atr/executor.py +384 -0
- atr/health.py +557 -0
- atr/hf_utils.py +449 -0
- atr/injection.py +422 -0
- atr/metrics.py +440 -0
- atr/policies.py +403 -0
- atr/py.typed +2 -0
- atr/registry.py +452 -0
- atr/schema.py +480 -0
- atr/tools/safe/__init__.py +75 -0
- atr/tools/safe/calculator.py +467 -0
- atr/tools/safe/datetime_tool.py +443 -0
- atr/tools/safe/file_reader.py +402 -0
- atr/tools/safe/http_client.py +316 -0
- atr/tools/safe/json_parser.py +374 -0
- atr/tools/safe/text_tool.py +537 -0
- atr/tools/safe/toolkit.py +175 -0
- caas/__init__.py +162 -0
- caas/api/__init__.py +7 -0
- caas/api/server.py +1328 -0
- caas/caching.py +834 -0
- caas/cli.py +210 -0
- caas/conversation.py +223 -0
- caas/decay.py +72 -0
- caas/detection/__init__.py +9 -0
- caas/detection/detector.py +238 -0
- caas/enrichment.py +130 -0
- caas/gateway/__init__.py +27 -0
- caas/gateway/trust_gateway.py +474 -0
- caas/hf_utils.py +479 -0
- caas/ingestion/__init__.py +23 -0
- caas/ingestion/processors.py +253 -0
- caas/ingestion/structure_parser.py +188 -0
- caas/models.py +356 -0
- caas/pragmatic_truth.py +444 -0
- caas/routing/__init__.py +10 -0
- caas/routing/heuristic_router.py +58 -0
- caas/storage/__init__.py +9 -0
- caas/storage/store.py +389 -0
- caas/triad.py +213 -0
- caas/tuning/__init__.py +9 -0
- caas/tuning/tuner.py +329 -0
- caas/vfs/__init__.py +14 -0
- caas/vfs/filesystem.py +452 -0
- cmvk/__init__.py +218 -0
- cmvk/audit.py +402 -0
- cmvk/benchmarks.py +478 -0
- cmvk/constitutional.py +904 -0
- cmvk/hf_utils.py +301 -0
- cmvk/metrics.py +473 -0
- cmvk/profiles.py +300 -0
- cmvk/py.typed +0 -0
- cmvk/types.py +12 -0
- cmvk/verification.py +956 -0
- emk/__init__.py +89 -0
- emk/causal.py +352 -0
- emk/hf_utils.py +421 -0
- emk/indexer.py +83 -0
- emk/py.typed +0 -0
- emk/schema.py +204 -0
- emk/sleep_cycle.py +347 -0
- emk/store.py +281 -0
- iatp/__init__.py +166 -0
- iatp/attestation.py +461 -0
- iatp/cli.py +317 -0
- iatp/hf_utils.py +472 -0
- iatp/ipc_pipes.py +580 -0
- iatp/main.py +412 -0
- iatp/models/__init__.py +447 -0
- iatp/policy_engine.py +337 -0
- iatp/py.typed +2 -0
- iatp/recovery.py +321 -0
- iatp/security/__init__.py +270 -0
- iatp/sidecar/__init__.py +519 -0
- iatp/telemetry/__init__.py +164 -0
- iatp/tests/__init__.py +1 -0
- iatp/tests/test_attestation.py +370 -0
- iatp/tests/test_cli.py +131 -0
- iatp/tests/test_ed25519_attestation.py +211 -0
- iatp/tests/test_models.py +130 -0
- iatp/tests/test_policy_engine.py +347 -0
- iatp/tests/test_recovery.py +281 -0
- iatp/tests/test_security.py +222 -0
- iatp/tests/test_sidecar.py +167 -0
- iatp/tests/test_telemetry.py +175 -0
- mcp_kernel_server/__init__.py +28 -0
- mcp_kernel_server/cli.py +274 -0
- mcp_kernel_server/resources.py +217 -0
- mcp_kernel_server/server.py +564 -0
- mcp_kernel_server/tools.py +1174 -0
- mute_agent/__init__.py +68 -0
- mute_agent/core/__init__.py +1 -0
- mute_agent/core/execution_agent.py +166 -0
- mute_agent/core/handshake_protocol.py +201 -0
- mute_agent/core/reasoning_agent.py +238 -0
- mute_agent/knowledge_graph/__init__.py +1 -0
- mute_agent/knowledge_graph/graph_elements.py +65 -0
- mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
- mute_agent/knowledge_graph/subgraph.py +224 -0
- mute_agent/listener/__init__.py +43 -0
- mute_agent/listener/adapters/__init__.py +31 -0
- mute_agent/listener/adapters/base_adapter.py +189 -0
- mute_agent/listener/adapters/caas_adapter.py +344 -0
- mute_agent/listener/adapters/control_plane_adapter.py +436 -0
- mute_agent/listener/adapters/iatp_adapter.py +332 -0
- mute_agent/listener/adapters/scak_adapter.py +251 -0
- mute_agent/listener/listener.py +610 -0
- mute_agent/listener/state_observer.py +436 -0
- mute_agent/listener/threshold_config.py +313 -0
- mute_agent/super_system/__init__.py +1 -0
- mute_agent/super_system/router.py +204 -0
- mute_agent/visualization/__init__.py +10 -0
- mute_agent/visualization/graph_debugger.py +502 -0
- nexus/README.md +60 -0
- nexus/__init__.py +51 -0
- nexus/arbiter.py +359 -0
- nexus/client.py +466 -0
- nexus/dmz.py +444 -0
- nexus/escrow.py +430 -0
- nexus/exceptions.py +286 -0
- nexus/pyproject.toml +36 -0
- nexus/registry.py +393 -0
- nexus/reputation.py +425 -0
- nexus/schemas/__init__.py +51 -0
- nexus/schemas/compliance.py +276 -0
- nexus/schemas/escrow.py +251 -0
- nexus/schemas/manifest.py +225 -0
- nexus/schemas/receipt.py +208 -0
- nexus/tests/__init__.py +0 -0
- nexus/tests/conftest.py +146 -0
- nexus/tests/test_arbiter.py +192 -0
- nexus/tests/test_dmz.py +194 -0
- nexus/tests/test_escrow.py +276 -0
- nexus/tests/test_exceptions.py +225 -0
- nexus/tests/test_registry.py +232 -0
- nexus/tests/test_reputation.py +328 -0
- nexus/tests/test_schemas.py +295 -0
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
MCP Kernel Server - Main server implementation.
|
|
5
|
+
|
|
6
|
+
Exposes Agent OS primitives through Model Context Protocol:
|
|
7
|
+
- Tools: cmvk_verify, kernel_execute, iatp_sign, iatp_verify, iatp_reputation
|
|
8
|
+
- Resources: VFS filesystem, audit logs
|
|
9
|
+
- Prompts: Standard agent instructions
|
|
10
|
+
|
|
11
|
+
AAIF Compliance:
|
|
12
|
+
- Stateless: All context in request, no session state
|
|
13
|
+
- MCP June 2026: Full protocol compliance
|
|
14
|
+
- Claude Desktop: Zero-config integration via stdio
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
# Stdio mode (for Claude Desktop)
|
|
18
|
+
mcp-kernel-server --stdio
|
|
19
|
+
|
|
20
|
+
# HTTP mode (for development)
|
|
21
|
+
mcp-kernel-server --http --port 8080
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import asyncio
|
|
25
|
+
import json
|
|
26
|
+
import logging
|
|
27
|
+
import sys
|
|
28
|
+
from typing import Any, Optional
|
|
29
|
+
from dataclasses import dataclass, asdict
|
|
30
|
+
|
|
31
|
+
from mcp_kernel_server.tools import (
|
|
32
|
+
CMVKVerifyTool,
|
|
33
|
+
KernelExecuteTool,
|
|
34
|
+
IATPSignTool,
|
|
35
|
+
IATPVerifyTool,
|
|
36
|
+
IATPReputationTool,
|
|
37
|
+
VerifyCodeSafetyTool,
|
|
38
|
+
CMVKReviewCodeTool,
|
|
39
|
+
GetAuditLogTool,
|
|
40
|
+
ToolResult,
|
|
41
|
+
)
|
|
42
|
+
from mcp_kernel_server.resources import VFSResource, VFSResourceTemplate
|
|
43
|
+
|
|
44
|
+
logger = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass
|
|
48
|
+
class ServerConfig:
|
|
49
|
+
"""Server configuration."""
|
|
50
|
+
host: str = "0.0.0.0"
|
|
51
|
+
port: int = 8080
|
|
52
|
+
policy_mode: str = "strict"
|
|
53
|
+
cmvk_threshold: float = 0.85
|
|
54
|
+
vfs_backend: str = "memory"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# =============================================================================
|
|
58
|
+
# MCP Prompts - Standard Agent Instructions
|
|
59
|
+
# =============================================================================
|
|
60
|
+
|
|
61
|
+
PROMPTS = {
|
|
62
|
+
"governed_agent": {
|
|
63
|
+
"name": "governed_agent",
|
|
64
|
+
"description": "Instructions for operating as a governed agent under Agent OS",
|
|
65
|
+
"arguments": [
|
|
66
|
+
{
|
|
67
|
+
"name": "agent_id",
|
|
68
|
+
"description": "Unique identifier for this agent",
|
|
69
|
+
"required": True
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "policies",
|
|
73
|
+
"description": "Comma-separated list of policies to enforce",
|
|
74
|
+
"required": False
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"template": """You are operating as a governed agent under Agent OS.
|
|
78
|
+
|
|
79
|
+
Agent ID: {agent_id}
|
|
80
|
+
Active Policies: {policies}
|
|
81
|
+
|
|
82
|
+
IMPORTANT RULES:
|
|
83
|
+
1. Before executing any action, use the kernel_execute tool
|
|
84
|
+
2. The kernel will check your action against active policies
|
|
85
|
+
3. If the kernel returns a SIGKILL, stop immediately
|
|
86
|
+
4. All actions are logged to the audit trail
|
|
87
|
+
|
|
88
|
+
Available Tools:
|
|
89
|
+
- kernel_execute: Execute actions with policy enforcement
|
|
90
|
+
- cmvk_verify: Verify claims across multiple models
|
|
91
|
+
- iatp_sign: Sign trust attestations for other agents
|
|
92
|
+
- iatp_verify: Verify trust relationships
|
|
93
|
+
- iatp_reputation: Query agent reputation network
|
|
94
|
+
|
|
95
|
+
Example usage:
|
|
96
|
+
```
|
|
97
|
+
Use kernel_execute with:
|
|
98
|
+
- action: "database_query"
|
|
99
|
+
- params: {"query": "SELECT * FROM users WHERE id = 1"}
|
|
100
|
+
- agent_id: "{agent_id}"
|
|
101
|
+
- policies: [{policies}]
|
|
102
|
+
```
|
|
103
|
+
"""
|
|
104
|
+
},
|
|
105
|
+
"verify_claim": {
|
|
106
|
+
"name": "verify_claim",
|
|
107
|
+
"description": "Instructions for verifying a claim using CMVK",
|
|
108
|
+
"arguments": [
|
|
109
|
+
{
|
|
110
|
+
"name": "claim",
|
|
111
|
+
"description": "The claim to verify",
|
|
112
|
+
"required": True
|
|
113
|
+
}
|
|
114
|
+
],
|
|
115
|
+
"template": """Verify the following claim using CMVK verification:
|
|
116
|
+
|
|
117
|
+
Claim: {claim}
|
|
118
|
+
|
|
119
|
+
Use the cmvk_verify tool to check this claim across multiple AI models.
|
|
120
|
+
This helps detect hallucinations and ensures accuracy.
|
|
121
|
+
|
|
122
|
+
The tool will return:
|
|
123
|
+
- verified: Whether models agree on the claim
|
|
124
|
+
- confidence: Agreement score (0-1)
|
|
125
|
+
- drift_score: Measure of disagreement between models
|
|
126
|
+
|
|
127
|
+
If drift_score > 0.15, the models significantly disagree and the claim needs review.
|
|
128
|
+
"""
|
|
129
|
+
},
|
|
130
|
+
"safe_execution": {
|
|
131
|
+
"name": "safe_execution",
|
|
132
|
+
"description": "Template for executing actions safely through the kernel",
|
|
133
|
+
"arguments": [
|
|
134
|
+
{
|
|
135
|
+
"name": "action",
|
|
136
|
+
"description": "The action to execute",
|
|
137
|
+
"required": True
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "params",
|
|
141
|
+
"description": "JSON parameters for the action",
|
|
142
|
+
"required": True
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"template": """Execute the following action through the Agent OS kernel:
|
|
146
|
+
|
|
147
|
+
Action: {action}
|
|
148
|
+
Parameters: {params}
|
|
149
|
+
|
|
150
|
+
Use kernel_execute tool with these values. The kernel will:
|
|
151
|
+
1. Check the action against active policies
|
|
152
|
+
2. Log the action to the audit trail
|
|
153
|
+
3. Execute if allowed, or return SIGKILL if blocked
|
|
154
|
+
|
|
155
|
+
If you receive a SIGKILL signal, do NOT retry the action.
|
|
156
|
+
Explain to the user why the action was blocked.
|
|
157
|
+
"""
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class KernelMCPServer:
|
|
163
|
+
"""
|
|
164
|
+
MCP Server exposing Agent OS kernel primitives.
|
|
165
|
+
|
|
166
|
+
Stateless Design (MCP June 2026 Standard):
|
|
167
|
+
- No session state maintained
|
|
168
|
+
- All context passed in each request
|
|
169
|
+
- State externalized to backend storage
|
|
170
|
+
- Horizontally scalable
|
|
171
|
+
|
|
172
|
+
Tools (8 total):
|
|
173
|
+
- verify_code_safety: Check code safety before execution
|
|
174
|
+
- cmvk_verify: Cross-model claim verification
|
|
175
|
+
- cmvk_review: Multi-model code review
|
|
176
|
+
- kernel_execute: Governed action execution
|
|
177
|
+
- iatp_sign: Trust attestation signing
|
|
178
|
+
- iatp_verify: Trust relationship verification
|
|
179
|
+
- iatp_reputation: Reputation query/slashing
|
|
180
|
+
- get_audit_log: Retrieve audit trail
|
|
181
|
+
|
|
182
|
+
Resources:
|
|
183
|
+
- vfs://{agent_id}/mem/* - Agent memory
|
|
184
|
+
- vfs://{agent_id}/policy/* - Agent policies
|
|
185
|
+
- audit://{agent_id}/log - Audit trail (read-only)
|
|
186
|
+
|
|
187
|
+
Prompts:
|
|
188
|
+
- governed_agent: Standard governed agent instructions
|
|
189
|
+
- verify_claim: CMVK verification template
|
|
190
|
+
- safe_execution: Safe action execution template
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
SERVER_NAME = "agent-os-kernel"
|
|
194
|
+
SERVER_VERSION = "1.2.0"
|
|
195
|
+
PROTOCOL_VERSION = "2024-11-05"
|
|
196
|
+
|
|
197
|
+
def __init__(self, config: Optional[ServerConfig] = None):
|
|
198
|
+
self.config = config or ServerConfig()
|
|
199
|
+
|
|
200
|
+
# Initialize tools (stateless)
|
|
201
|
+
self.tools = {
|
|
202
|
+
"verify_code_safety": VerifyCodeSafetyTool(),
|
|
203
|
+
"cmvk_verify": CMVKVerifyTool({"threshold": self.config.cmvk_threshold}),
|
|
204
|
+
"cmvk_review": CMVKReviewCodeTool(),
|
|
205
|
+
"kernel_execute": KernelExecuteTool({"policy_mode": self.config.policy_mode}),
|
|
206
|
+
"iatp_sign": IATPSignTool(),
|
|
207
|
+
"iatp_verify": IATPVerifyTool(),
|
|
208
|
+
"iatp_reputation": IATPReputationTool(),
|
|
209
|
+
"get_audit_log": GetAuditLogTool(),
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
# Initialize resources (stateless with external backend)
|
|
213
|
+
self.vfs = VFSResource({"backend": self.config.vfs_backend})
|
|
214
|
+
|
|
215
|
+
# Prompts (static)
|
|
216
|
+
self.prompts = PROMPTS
|
|
217
|
+
|
|
218
|
+
# =========================================================================
|
|
219
|
+
# MCP Protocol Handlers
|
|
220
|
+
# =========================================================================
|
|
221
|
+
|
|
222
|
+
async def handle_initialize(self, params: dict) -> dict:
|
|
223
|
+
"""Handle MCP initialize request."""
|
|
224
|
+
return {
|
|
225
|
+
"protocolVersion": self.PROTOCOL_VERSION,
|
|
226
|
+
"capabilities": {
|
|
227
|
+
"tools": {"listChanged": False},
|
|
228
|
+
"resources": {"subscribe": False, "listChanged": False},
|
|
229
|
+
"prompts": {"listChanged": False},
|
|
230
|
+
},
|
|
231
|
+
"serverInfo": {
|
|
232
|
+
"name": self.SERVER_NAME,
|
|
233
|
+
"version": self.SERVER_VERSION
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async def handle_list_tools(self) -> dict:
|
|
238
|
+
"""Handle MCP tools/list request."""
|
|
239
|
+
return {
|
|
240
|
+
"tools": [
|
|
241
|
+
{
|
|
242
|
+
"name": tool.name,
|
|
243
|
+
"description": tool.description,
|
|
244
|
+
"inputSchema": tool.input_schema
|
|
245
|
+
}
|
|
246
|
+
for tool in self.tools.values()
|
|
247
|
+
]
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async def handle_call_tool(self, name: str, arguments: dict) -> dict:
|
|
251
|
+
"""Handle MCP tools/call request."""
|
|
252
|
+
if name not in self.tools:
|
|
253
|
+
return {
|
|
254
|
+
"isError": True,
|
|
255
|
+
"content": [{"type": "text", "text": f"Unknown tool: {name}"}]
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
tool = self.tools[name]
|
|
259
|
+
|
|
260
|
+
try:
|
|
261
|
+
result = await tool.execute(arguments)
|
|
262
|
+
|
|
263
|
+
if result.success:
|
|
264
|
+
return {
|
|
265
|
+
"content": [
|
|
266
|
+
{
|
|
267
|
+
"type": "text",
|
|
268
|
+
"text": json.dumps(result.data, indent=2)
|
|
269
|
+
}
|
|
270
|
+
],
|
|
271
|
+
"isError": False
|
|
272
|
+
}
|
|
273
|
+
else:
|
|
274
|
+
return {
|
|
275
|
+
"content": [
|
|
276
|
+
{
|
|
277
|
+
"type": "text",
|
|
278
|
+
"text": result.error or "Execution failed"
|
|
279
|
+
}
|
|
280
|
+
],
|
|
281
|
+
"isError": True
|
|
282
|
+
}
|
|
283
|
+
except Exception as e:
|
|
284
|
+
logger.exception(f"Tool execution failed: {name}")
|
|
285
|
+
return {
|
|
286
|
+
"isError": True,
|
|
287
|
+
"content": [{"type": "text", "text": str(e)}]
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
async def handle_list_resources(self) -> dict:
|
|
291
|
+
"""Handle MCP resources/list request."""
|
|
292
|
+
return {
|
|
293
|
+
"resources": [
|
|
294
|
+
{
|
|
295
|
+
"uri": "vfs://",
|
|
296
|
+
"name": "Agent VFS Root",
|
|
297
|
+
"description": "Virtual File System for agent memory",
|
|
298
|
+
"mimeType": "application/json"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"uri": "audit://",
|
|
302
|
+
"name": "Audit Log",
|
|
303
|
+
"description": "Immutable audit trail of agent actions",
|
|
304
|
+
"mimeType": "application/json"
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
async def handle_list_resource_templates(self) -> dict:
|
|
310
|
+
"""Handle MCP resources/templates/list request."""
|
|
311
|
+
templates = VFSResourceTemplate.get_templates()
|
|
312
|
+
templates.append({
|
|
313
|
+
"uriTemplate": "audit://{agent_id}/log",
|
|
314
|
+
"name": "Agent Audit Log",
|
|
315
|
+
"description": "Read-only audit trail for agent",
|
|
316
|
+
"mimeType": "application/json"
|
|
317
|
+
})
|
|
318
|
+
return {"resourceTemplates": templates}
|
|
319
|
+
|
|
320
|
+
async def handle_read_resource(self, uri: str) -> dict:
|
|
321
|
+
"""Handle MCP resources/read request."""
|
|
322
|
+
try:
|
|
323
|
+
if uri.startswith("audit://"):
|
|
324
|
+
result = await self._read_audit(uri)
|
|
325
|
+
else:
|
|
326
|
+
result = await self.vfs.read(uri)
|
|
327
|
+
|
|
328
|
+
return {
|
|
329
|
+
"contents": [
|
|
330
|
+
{
|
|
331
|
+
"uri": result.uri,
|
|
332
|
+
"mimeType": result.mime_type,
|
|
333
|
+
"text": json.dumps(result.content, indent=2)
|
|
334
|
+
}
|
|
335
|
+
]
|
|
336
|
+
}
|
|
337
|
+
except Exception as e:
|
|
338
|
+
logger.exception(f"Resource read failed: {uri}")
|
|
339
|
+
return {
|
|
340
|
+
"contents": [
|
|
341
|
+
{
|
|
342
|
+
"uri": uri,
|
|
343
|
+
"mimeType": "text/plain",
|
|
344
|
+
"text": f"Error: {str(e)}"
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
async def _read_audit(self, uri: str) -> Any:
|
|
350
|
+
"""Read from audit log."""
|
|
351
|
+
from mcp_kernel_server.resources import ResourceContent
|
|
352
|
+
|
|
353
|
+
# Parse audit://agent_id/log
|
|
354
|
+
parts = uri.replace("audit://", "").split("/")
|
|
355
|
+
agent_id = parts[0] if parts else "unknown"
|
|
356
|
+
|
|
357
|
+
# Return audit entries (in production, from external store)
|
|
358
|
+
return ResourceContent(
|
|
359
|
+
uri=uri,
|
|
360
|
+
mime_type="application/json",
|
|
361
|
+
content={
|
|
362
|
+
"agent_id": agent_id,
|
|
363
|
+
"entries": [], # Would be populated from audit backend
|
|
364
|
+
"note": "Audit log is append-only and immutable"
|
|
365
|
+
}
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
# =========================================================================
|
|
369
|
+
# MCP Prompts Handlers
|
|
370
|
+
# =========================================================================
|
|
371
|
+
|
|
372
|
+
async def handle_list_prompts(self) -> dict:
|
|
373
|
+
"""Handle MCP prompts/list request."""
|
|
374
|
+
return {
|
|
375
|
+
"prompts": [
|
|
376
|
+
{
|
|
377
|
+
"name": p["name"],
|
|
378
|
+
"description": p["description"],
|
|
379
|
+
"arguments": p.get("arguments", [])
|
|
380
|
+
}
|
|
381
|
+
for p in self.prompts.values()
|
|
382
|
+
]
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
async def handle_get_prompt(self, name: str, arguments: dict) -> dict:
|
|
386
|
+
"""Handle MCP prompts/get request."""
|
|
387
|
+
if name not in self.prompts:
|
|
388
|
+
return {
|
|
389
|
+
"isError": True,
|
|
390
|
+
"description": f"Unknown prompt: {name}"
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
prompt = self.prompts[name]
|
|
394
|
+
|
|
395
|
+
# Fill in template with arguments
|
|
396
|
+
template = prompt["template"]
|
|
397
|
+
for arg in prompt.get("arguments", []):
|
|
398
|
+
arg_name = arg["name"]
|
|
399
|
+
arg_value = arguments.get(arg_name, "")
|
|
400
|
+
template = template.replace(f"{{{arg_name}}}", str(arg_value))
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
"description": prompt["description"],
|
|
404
|
+
"messages": [
|
|
405
|
+
{
|
|
406
|
+
"role": "user",
|
|
407
|
+
"content": {
|
|
408
|
+
"type": "text",
|
|
409
|
+
"text": template
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
]
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
# =========================================================================
|
|
416
|
+
# Stdio Transport (for Claude Desktop)
|
|
417
|
+
# =========================================================================
|
|
418
|
+
|
|
419
|
+
async def run_stdio(self):
|
|
420
|
+
"""
|
|
421
|
+
Run server in stdio mode for Claude Desktop integration.
|
|
422
|
+
|
|
423
|
+
Protocol: JSON-RPC 2.0 over stdin/stdout
|
|
424
|
+
Each message is newline-delimited JSON
|
|
425
|
+
"""
|
|
426
|
+
logger.info("Starting MCP Kernel Server in stdio mode")
|
|
427
|
+
|
|
428
|
+
reader = asyncio.StreamReader()
|
|
429
|
+
protocol = asyncio.StreamReaderProtocol(reader)
|
|
430
|
+
await asyncio.get_event_loop().connect_read_pipe(lambda: protocol, sys.stdin)
|
|
431
|
+
|
|
432
|
+
writer_transport, writer_protocol = await asyncio.get_event_loop().connect_write_pipe(
|
|
433
|
+
asyncio.streams.FlowControlMixin, sys.stdout
|
|
434
|
+
)
|
|
435
|
+
writer = asyncio.StreamWriter(writer_transport, writer_protocol, reader, asyncio.get_event_loop())
|
|
436
|
+
|
|
437
|
+
while True:
|
|
438
|
+
try:
|
|
439
|
+
line = await reader.readline()
|
|
440
|
+
if not line:
|
|
441
|
+
break
|
|
442
|
+
|
|
443
|
+
request = json.loads(line.decode())
|
|
444
|
+
response = await self._handle_jsonrpc(request)
|
|
445
|
+
|
|
446
|
+
writer.write((json.dumps(response) + "\n").encode())
|
|
447
|
+
await writer.drain()
|
|
448
|
+
|
|
449
|
+
except Exception as e:
|
|
450
|
+
logger.exception("Stdio handler error")
|
|
451
|
+
error_response = {
|
|
452
|
+
"jsonrpc": "2.0",
|
|
453
|
+
"error": {"code": -32603, "message": str(e)},
|
|
454
|
+
"id": None
|
|
455
|
+
}
|
|
456
|
+
writer.write((json.dumps(error_response) + "\n").encode())
|
|
457
|
+
await writer.drain()
|
|
458
|
+
|
|
459
|
+
async def _handle_jsonrpc(self, request: dict) -> dict:
|
|
460
|
+
"""Handle JSON-RPC request."""
|
|
461
|
+
method = request.get("method", "")
|
|
462
|
+
params = request.get("params", {})
|
|
463
|
+
request_id = request.get("id")
|
|
464
|
+
|
|
465
|
+
try:
|
|
466
|
+
if method == "initialize":
|
|
467
|
+
result = await self.handle_initialize(params)
|
|
468
|
+
elif method == "tools/list":
|
|
469
|
+
result = await self.handle_list_tools()
|
|
470
|
+
elif method == "tools/call":
|
|
471
|
+
result = await self.handle_call_tool(params.get("name"), params.get("arguments", {}))
|
|
472
|
+
elif method == "resources/list":
|
|
473
|
+
result = await self.handle_list_resources()
|
|
474
|
+
elif method == "resources/templates/list":
|
|
475
|
+
result = await self.handle_list_resource_templates()
|
|
476
|
+
elif method == "resources/read":
|
|
477
|
+
result = await self.handle_read_resource(params.get("uri", ""))
|
|
478
|
+
elif method == "prompts/list":
|
|
479
|
+
result = await self.handle_list_prompts()
|
|
480
|
+
elif method == "prompts/get":
|
|
481
|
+
result = await self.handle_get_prompt(params.get("name"), params.get("arguments", {}))
|
|
482
|
+
else:
|
|
483
|
+
return {
|
|
484
|
+
"jsonrpc": "2.0",
|
|
485
|
+
"error": {"code": -32601, "message": f"Unknown method: {method}"},
|
|
486
|
+
"id": request_id
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
return {
|
|
490
|
+
"jsonrpc": "2.0",
|
|
491
|
+
"result": result,
|
|
492
|
+
"id": request_id
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
except Exception as e:
|
|
496
|
+
logger.exception(f"Method {method} failed")
|
|
497
|
+
return {
|
|
498
|
+
"jsonrpc": "2.0",
|
|
499
|
+
"error": {"code": -32603, "message": str(e)},
|
|
500
|
+
"id": request_id
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
# =========================================================================
|
|
504
|
+
# Server Lifecycle
|
|
505
|
+
# =========================================================================
|
|
506
|
+
|
|
507
|
+
async def start(self):
|
|
508
|
+
"""Start the MCP server."""
|
|
509
|
+
logger.info(f"Starting MCP Kernel Server on {self.config.host}:{self.config.port}")
|
|
510
|
+
|
|
511
|
+
async def stop(self):
|
|
512
|
+
"""Stop the MCP server."""
|
|
513
|
+
logger.info("Stopping MCP Kernel Server")
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
# =========================================================================
|
|
517
|
+
# Stateless Execution Helper (for direct integration)
|
|
518
|
+
# =========================================================================
|
|
519
|
+
|
|
520
|
+
async def stateless_execute(
|
|
521
|
+
action: str,
|
|
522
|
+
params: dict,
|
|
523
|
+
context: dict,
|
|
524
|
+
config: Optional[dict] = None
|
|
525
|
+
) -> dict:
|
|
526
|
+
"""
|
|
527
|
+
Execute an action through the kernel statelessly.
|
|
528
|
+
|
|
529
|
+
This is the core stateless API for June 2026 MCP compliance:
|
|
530
|
+
- All context passed in request
|
|
531
|
+
- No session state maintained
|
|
532
|
+
- Can run on any server instance
|
|
533
|
+
|
|
534
|
+
Args:
|
|
535
|
+
action: Action to execute (e.g., "database_query")
|
|
536
|
+
params: Action parameters
|
|
537
|
+
context: Full execution context including:
|
|
538
|
+
- agent_id: Identifier for the agent
|
|
539
|
+
- policies: List of policy names to enforce
|
|
540
|
+
- history: Previous interactions (optional)
|
|
541
|
+
- state: External state reference (optional)
|
|
542
|
+
config: Optional server configuration
|
|
543
|
+
|
|
544
|
+
Returns:
|
|
545
|
+
Execution result with success status and data
|
|
546
|
+
"""
|
|
547
|
+
server = KernelMCPServer(ServerConfig(**(config or {})))
|
|
548
|
+
|
|
549
|
+
tool_args = {
|
|
550
|
+
"action": action,
|
|
551
|
+
"params": params,
|
|
552
|
+
"agent_id": context.get("agent_id", "anonymous"),
|
|
553
|
+
"policies": context.get("policies", []),
|
|
554
|
+
"context": context
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
result = await server.tools["kernel_execute"].execute(tool_args)
|
|
558
|
+
|
|
559
|
+
return {
|
|
560
|
+
"success": result.success,
|
|
561
|
+
"data": result.data,
|
|
562
|
+
"error": result.error,
|
|
563
|
+
"metadata": result.metadata
|
|
564
|
+
}
|