ADR-038: A2A Protocol & Semantic Kernel Integration Architecture

Status: Accepted Version: 1.0 Date: 2026-01-02 Supersedes: N/A Related ADRs: ADR-017 (MCP-LSP Integration), ADR-032 (NATS JetStream), ADR-033 (Kernel-Shell) Related PRDs: PRD-027


[!NOTE] Implementation Details: The technical specifications for this architecture are in:

This ADR remains the authoritative architectural decision; the SDS documents provide implementation details.

Context

SEA-Forge™ agents currently communicate via:

However, there is no standardized way for SEA™ agents to:

  1. Communicate with external AI agents built on different frameworks (LangGraph, CrewAI, Google ADK)
  2. Orchestrate complex internal workflows with memory, planning, and plugin execution
  3. Expose capabilities for discovery by external systems

Industry Context:

Protocol Relationship

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────────┐
│                     SEA™ Agent Runtime                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐      │
│   │    MCP      │   │     A2A     │   │  Semantic   │      │
│   │ (Tools)     │   │  (Agents)   │   │   Kernel    │      │
│   └──────┬──────┘   └──────┬──────┘   └──────┬──────┘      │
│          │                 │                 │              │
│          └────────────┬────┴─────────────────┘              │
│                       │                                     │
│              ┌────────▼────────┐                            │
│              │   Kernel Core   │                            │
│              │  (SDS-031/055)  │                            │
│              └─────────────────┘                            │
└─────────────────────────────────────────────────────────────┘

Protocol Purposes:
- MCP:    Agent ↔ Tool     (how agents use capabilities)
- A2A:    Agent ↔ Agent    (how agents collaborate)
- SK:     Internal Orchestration (workflows, memory, plugins)

Decision

Integrate A2A Protocol and Microsoft Semantic Kernel to enable SEA™ agents to:

  1. Receive tasks from external agents via A2A Server
  2. Delegate tasks to external agents via A2A Client
  3. Orchestrate internal workflows via Semantic Kernel
  4. Expose capabilities via A2A Agent Card (derived from SK plugins)

Integration Architecture

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
External Agents                    SEA™ Agent Runtime
     │                                    │
     │  A2A Protocol                      │
     │  (REST/JSON)                       │
     ▼                                    ▼
┌─────────────────────────────────────────────────────────────┐
│                   A2A Protocol Gateway                       │
│  ┌─────────────────────┐  ┌─────────────────────┐           │
│  │    A2A Server       │  │    A2A Client       │           │
│  │  (Receive Tasks)    │  │  (Delegate Tasks)   │           │
│  └──────────┬──────────┘  └──────────┬──────────┘           │
└─────────────┼────────────────────────┼──────────────────────┘
              │                        │
              ▼                        ▼
┌─────────────────────────────────────────────────────────────┐
│                  Semantic Kernel Runtime                     │
│  ┌───────────────┐  ┌─────────────┐  ┌─────────────────┐    │
│  │    Plugins    │  │   Filters   │  │     Memory      │    │
│  │  (Capabilities)│  │ (Governance)│  │  (pgvector)     │    │
│  └───────────────┘  └─────────────┘  └─────────────────┘    │
│           │                │                   │             │
│           └────────────────┼───────────────────┘             │
│                            ▼                                 │
│                   ┌────────────────┐                         │
│                   │  Kernel Core   │                         │
│                   │  (Execution)   │                         │
│                   └────────────────┘                         │
└─────────────────────────────────────────────────────────────┘
              │                        │
              ▼                        ▼
┌─────────────────────────────────────────────────────────────┐
│                 Existing Infrastructure                      │
│  ┌─────────────┐  ┌─────────────────┐  ┌─────────────────┐  │
│  │  MCP Tools  │  │  NATS JetStream │  │  Observability  │  │
│  │  (SDS-052)  │  │    (SDS-047)    │  │    (SDS-030)    │  │
│  └─────────────┘  └─────────────────┘  └─────────────────┘  │
└─────────────────────────────────────────────────────────────┘

Technology Choices

Component Selection Justification
A2A Protocol Binding REST User confirmed; matches FastAPI patterns
Agent Discovery Auto-discovery User confirmed
Semantic Kernel SDK Python User confirmed; matches existing stack
A2A Python SDK a2a Official Linux Foundation SDK
Memory Backend pgvector Existing infrastructure

A2A Agent Card

SEA™ agents are discoverable via A2A Agent Card at /.well-known/agent.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
  "name": "sea-forge-agent",
  "version": "1.0.0",
  "description": "SEA-Forge™ semantic engineering agent",
  "url": "https://sea.example.com",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true
  },
  "skills": [
    {
      "id": "semantic-analysis",
      "name": "Semantic Code Analysis",
      "description": "Analyze code semantics using LSP intelligence"
    },
    {
      "id": "artifact-generation",
      "name": "Artifact Generation",
      "description": "Generate CADSL diagrams and documentation"
    }
  ],
  "authentication": {
    "schemes": ["bearer"]
  }
}

Semantic Kernel Governance

All SK executions pass through governance filters per SDS-031:

1
2
3
4
5
6
7
8
# Filter execution flow
@kernel.filter(FilterTypes.FUNCTION_INVOCATION)
async def hitl_filter(context: FunctionInvocationContext, next):
    if context.function.metadata.get("requires_approval"):
        approval = await request_hitl_approval(context)
        if not approval.granted:
            raise HITLRejected(approval.reason)
    return await next(context)

Rationale

Why A2A?

Why Semantic Kernel?

Alternatives Considered

LangGraph Only

Rejected — Great for graph-based agents but lacks:

Custom Agent Framework

Rejected — NIH problem; requires significant development and maintenance.

A2A Without Semantic Kernel

Rejected — A2A handles communication but not internal orchestration.

Constraints

A2A Protocol

Semantic Kernel

Governance

Quality Attributes

Bounded Contexts Impacted

Consequences

Positive

Negative

Implementation Plan

See P027: A2A Protocol & Semantic Kernel Integration

Additional Notes

External References

Reference URL
A2A Protocol Specification https://a2a-protocol.org/latest/specification/
A2A Python SDK https://github.com/a2aproject/a2a-python
Semantic Kernel Python https://github.com/microsoft/semantic-kernel
Semantic Kernel Docs https://learn.microsoft.com/en-us/semantic-kernel/