High-performance binary protocol for AI agent communication
The JavaScript/TypeScript implementation of MXP Protocol
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β YOUR APPLICATION β
β (AI Agent, Chatbot, Multi-Agent System) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β A2A COMPATIBILITY LAYER β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β β Message β β Task β β AgentCard β β JSON-RPC β β
β β + Part β β + Artifact β β + Skills β β Request/Response β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β @mxp-protocol/core/a2a β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
toMxp() ββββ΄βββΊ fromMxp()
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MXP PROTOCOL CORE β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 64-byte Header β β
β β ββββββββββ¬βββββββββ¬ββββββββ¬βββββββββββ¬βββββββββββ¬βββββββββββββββββ β β
β β βVersion β Type β Flags β Trace ID β Msg ID β Checksum β β β
β β β 1 byte β 1 byte β1 byte β 8 bytes β 8 bytes β 8 bytes β β β
β β ββββββββββ΄βββββββββ΄ββββββββ΄βββββββββββ΄βββββββββββ΄βββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Variable-length Payload β β
β β (Your data - any binary format) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β @mxp-protocol/core β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
encode() βββ΄ββΊ decode()
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WEBRTC TRANSPORT β
β βββββββββββββββββ βββββββββββββββββ ββββββββββββββββββββββββββββββββ β
β β Signaling β β Peer β β RTCDataChannel β β
β β (WebSocket) βββββΊβ Connection βββββΊβ (Reliable / Unreliable) β β
β βββββββββββββββββ βββββββββββββββββ ββββββββββββββββββββββββββββββββ β
β @mxp-protocol/core/transport β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NETWORK (P2P) β
β DTLS Encrypted β’ NAT Traversal β’ ICE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sequenceDiagram
participant App as Your App
participant A2A as A2A Layer
participant MXP as MXP Core
participant Transport as WebRTC
participant Network as Network
App->>A2A: Message.userText("Hello")
A2A->>MXP: toMxp(message)
Note over MXP: Add trace ID<br/>Add message ID<br/>Compute checksum
MXP->>Transport: encode(mxpMessage)
Note over Transport: 64-byte header<br/>+ payload
Transport->>Network: RTCDataChannel.send()
Note over Network: DTLS encrypted<br/>P2P delivery
sequenceDiagram
participant A as Peer A
participant S as Signaling Server
participant B as Peer B
Note over A,B: 1. Exchange Offers via Signaling
A->>S: Offer (SDP)
S->>B: Offer (SDP)
B->>S: Answer (SDP)
S->>A: Answer (SDP)
Note over A,B: 2. Exchange ICE Candidates
A->>S: ICE Candidate
S->>B: ICE Candidate
B->>S: ICE Candidate
S->>A: ICE Candidate
Note over A,B: 3. Direct P2P Connection
A->>B: MXP Message
B->>A: MXP Message
Note over A,B: Direct P2P via RTCDataChannel<br/>No server in the middle!
MXP (This SDK) Traditional (JSON/HTTP)
βββββββββββββββββββββββ βββββββββββββββββββββββ
β Application β β Application β
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€
β A2A Semantics βββββββββββββΊβ A2A Semantics β
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€
β MXP Binary β β JSON β
β (37x faster) β β (2.2ΞΌs/msg) β
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€
β WebRTC / UDP β β HTTP / TCP β
β (P2P, low lat) β β (server required) β
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€
β DTLS (built-in) β β TLS (separate) β
βββββββββββββββββββββββ βββββββββββββββββββββββ
β
37x faster encoding β Slow JSON parsing
β
P2P (no server) β Server required
β
Built-in tracing β External tracing
β
Native streaming β HTTP streaming hacks
βββββββββββββββ
β Agent A β
β (Browser) β
ββββββββ¬βββββββ
β
βββββββββββββββΌββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββ ββββββββββββ ββββββββββββ
β Agent B β β Agent C β β Agent D β
β (Node) β β (Browser)β β (Rust) β
ββββββββββββ ββββββββββββ ββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β All connections are: β
β β’ Direct P2P (no central server for data) β
β β’ Encrypted (DTLS) β
β β’ Binary (MXP format) β
β β’ Traceable (built-in trace IDs) β
β β’ Wire-compatible (JS β Rust β any MXP impl) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
@mxp-protocol/core
β
βββ Core βββββββββββββββββββββββββββββββββββββββββββββββββ
β βββ Message # MXP message class
β βββ encode/decode # Binary codec
β βββ MessageType # Call, Response, Stream*, etc.
β βββ generateTraceId # Distributed tracing
β
βββ /a2a βββββββββββββββββββββββββββββββββββββββββββββββββ
β βββ Message # A2A message with parts
β βββ Task/Artifact # Long-running operations
β βββ AgentCard # Discovery (/.well-known/)
β βββ toMxp/fromMxp # Conversion layer
β βββ JsonRpc* # HTTP gateway support
β
βββ /transport βββββββββββββββββββββββββββββββββββββββββββ
βββ WebRTCTransport # Multi-peer manager
βββ Peer # Single connection
βββ *Signaling # Connection setup
βββ ConnectionState # Lifecycle tracking
- π High Performance - Binary encoding ~37x faster than JSON
- π A2A Compatible - Works with Google's Agent-to-Agent protocol
- π Built-in Tracing - Every message has a trace ID
- π Streaming Support - Native LLM token streaming
- π¦ Zero Dependencies - Lightweight core library
- π Type Safe - Full TypeScript support
pnpm add @mxp-protocol/core
# or
npm install @mxp-protocol/core
# or
yarn add @mxp-protocol/coreimport { Message, MessageType, encode, decode } from '@mxp-protocol/core';
// Create a message
const msg = Message.call('Hello, agent!');
// Encode to binary
const { bytes } = encode(msg);
console.log(`Encoded: ${bytes.length} bytes`);
// Decode from binary
const decoded = decode(bytes);
console.log(`Trace ID: ${decoded.traceId}`);
console.log(`Payload: ${decoded.payloadAsString()}`);import { Message, toMxp, fromMxp, AgentCard } from '@mxp-protocol/core/a2a';
// Create an A2A message
const msg = Message.userText('Search for Rust tutorials');
// Convert to MXP for high-performance transport
const mxpMsg = toMxp(msg);
// Send over network...
// const bytes = encode(mxpMsg);
// Receive and convert back to A2A
const { method, message } = fromMxp(mxpMsg);
console.log(`Method: ${method}`);
console.log(`Text: ${message?.textContent()}`);import { AgentCard, AgentSkill } from '@mxp-protocol/core/a2a';
// Create an agent card with MXP support
const card = AgentCard.withMxp(
'My Agent',
'An AI assistant',
'https://api.example.com/agent',
'mxp://api.example.com:9000'
)
.withStreaming()
.withSkill(
new AgentSkill('search', 'Web Search', 'Search the internet')
.withTags(['search', 'web'])
);
// Serve at /.well-known/agent-card.json
console.log(card.toJSON());Perfect for LLM token-by-token output:
ββββββββββββ ββββββββββββ
β Client β β LLM β
β β β Agent β
ββββββ¬ββββββ ββββββ¬ββββββ
β β
β StreamOpen (prompt: "Write a poem") β
β ββββββββββββββββββββββββββββββββββββββββββββββββββΊ β
β β
β StreamChunk ("Roses ") β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ
β StreamChunk ("are ") β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ
β StreamChunk ("red,") β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ
β ... β
β StreamClose β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
import { Message, toMxpStreamOpen, toMxpStreamChunk, toMxpStreamClose } from '@mxp-protocol/core/a2a';
// Open stream
const openMsg = toMxpStreamOpen(Message.userText('Write a poem'));
const streamId = openMsg.messageId;
// Send chunks
for (const token of generateTokens()) {
const chunk = toMxpStreamChunk(token, streamId);
// send chunk...
}
// Close stream
const closeMsg = toMxpStreamClose(streamId);For long-running operations with status updates:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TASK LIFECYCLE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββ βββββββββββββ βββββββββββββββββββ βββββββββββββ
β SUBMITTED ββββββΊβ WORKING ββββββΊβ INPUT_REQUIRED ββββββΊβ COMPLETED β
βββββββββββββ βββββββββββββ βββββββββββββββββββ βββββββββββββ
β β β β
β β β β
β βΌ βΌ β
β βββββββββββββ User provides β
β β FAILED β more input β
β βββββββββββββ β β
β β β
βΌ βΌ βΌ
βββββββββββββ Back to WORKING βββββββββββββ
β CANCELED β β Artifacts β
βββββββββββββ βββββββββββββ
import { Task, TaskState, Artifact } from '@mxp-protocol/core/a2a';
// Create task
const task = new Task();
console.log(task.id); // UUID
// Update status
task.setStatus(TaskState.Working);
// Add output artifacts
task.addArtifact(Artifact.text('summary', 'Here are the results...'));
task.addArtifact(Artifact.data('metrics', { accuracy: 0.95 }));
// Complete
task.setStatus(TaskState.Completed);import { WebRTCTransport, WebSocketSignaling } from '@mxp-protocol/core/transport';
import { Message } from '@mxp-protocol/core';
// Connect to signaling server
const signaling = new WebSocketSignaling('ws://signal.example.com', 'my-peer-id');
await signaling.connect();
// Create transport
const transport = new WebRTCTransport(signaling, { debug: true });
// Handle incoming messages
transport.on('message', ({ message, peerId }) => {
console.log(`From ${peerId}: ${message.payloadAsString()}`);
});
// Connect to another peer
await transport.connect('other-peer-id');
// Send a message
transport.send('other-peer-id', Message.call('Hello!'));
// Broadcast to all peers
transport.broadcast(Message.call('Hello everyone!'));// WebSocket signaling (cross-device)
const ws = new WebSocketSignaling('ws://server/signal', 'peer-id');
// BroadcastChannel (same-origin, different tabs)
const bc = new BroadcastChannelSignaling('my-channel', 'peer-id');
// In-memory (testing)
const hub = new InMemorySignalingHub();
const provider = hub.createProvider('peer-id');| Export | Description |
|---|---|
Message |
Core message class |
MessageType |
Message type enum |
MessageFlags |
Message flags enum |
encode(msg) |
Encode message to binary |
decode(bytes) |
Decode message from binary |
generateTraceId() |
Generate random trace ID |
| Export | Description |
|---|---|
Message |
A2A message with parts |
Part |
Message part (text/file/data) |
Task |
Long-running task |
Artifact |
Task output |
AgentCard |
Agent discovery card |
AgentSkill |
Agent capability |
toMxp(msg) |
Convert A2A β MXP |
fromMxp(mxp) |
Convert MXP β A2A |
JsonRpcRequest |
JSON-RPC request |
JsonRpcResponse |
JSON-RPC response |
| Export | Description |
|---|---|
WebRTCTransport |
Peer-to-peer transport |
Peer |
Single peer connection |
WebSocketSignaling |
WebSocket signaling |
BroadcastChannelSignaling |
Same-origin signaling |
InMemorySignalingHub |
Testing signaling |
ConnectionState |
Connection states |
ChannelMode |
Reliable/unreliable modes |
βββββββββββββββ WebRTC βββββββββββββββ
β Browser ββββββββββββββββββββββββββΊβ Browser β
β Agent A β (Direct P2P) β Agent B β
βββββββββββββββ βββββββββββββββ
β β
ββββββββββββ ββββββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββ
β Signaling Server β (Only for connection setup)
β (WebSocket) β
βββββββββββββββββββββββ
βββββββββββββββ WebRTC/WS βββββββββββββββ
β Browser βββββββββββββββββββββββββΊβ Server β
β Client β β (Node.js) β
βββββββββββββββ βββββββββββββββ
β
βΌ
βββββββββββββββ
β LLM / API β
βββββββββββββββ
βββββββββββββββ
β Agent A β
ββββββββ¬βββββββ
β
ββββββββββββββΌβββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββ ββββββββββββ ββββββββββββ
β Agent B βββ Agent C βββ Agent D β
ββββββββββββ ββββββββββββ ββββββββββββ
β β β
ββββββββββββββ΄βββββββββββββ
Full Mesh P2P
- Node.js: 18+
- Browsers: Modern browsers with
crypto.getRandomValues - Deno: Supported
- Bun: Supported
This SDK produces binary messages that are wire-compatible with the Rust implementation. You can send messages from JavaScript to Rust and vice versa.
| Operation | MXP | JSON | Speedup |
|---|---|---|---|
| Encode 256B | ~60ns | ~2.2ΞΌs | 37x |
| Decode 256B | ~40ns | ~1.8ΞΌs | 45x |
Benchmarks from Rust implementation. JS performance varies by runtime.
- mxp-protocol - Rust implementation (canonical)
- MXP Spec - Protocol specification
- A2A Guide - A2A compatibility guide
Licensed under either of:
- MIT license (LICENSE-MIT)
- Apache License, Version 2.0 (LICENSE-APACHE)
at your option.