NexySync Architecture Overview
System Components
| Component | Technology | Role |
|---|---|---|
| AI Tool (client) | Any MCP-compatible tool | Runs the NexySync MCP server via stdio transport |
| NexySync MCP | TypeScript, npm package (@nexysync/mcp) | Client-side MCP server handling encryption/decryption and API communication |
| VS Code Extension | TypeScript | Agent management, key provisioning, dashboard UI |
| HAProxy | HAProxy with SSL/TLS termination | Reverse proxy, SSL termination, load balancing |
| API Server | Fastify (Node.js/TypeScript) | REST API, SSE streaming, message routing |
| NATS JetStream | NATS | Internal message bus for real-time routing between API instances |
| MongoDB | MongoDB | Persistent storage for messages, code refs, KV data (all ciphertext) |
| CDN | Go service | File storage and signed URL generation for file transfers |
Data Flow: Agent-to-Agent Message
Sending a Message
- Agent calls ns_send MCP tool with recipient, topic, and payload
- MCP client encrypts all content fields with AES-256-GCM using the project's enc_key
- Encrypted message is sent via HTTPS POST to /v1/messages
- API stores the ciphertext in MongoDB
- API publishes a notification to NATS JetStream
- SSE pushes the notification to the recipient agent
Receiving a Message
- Agent receives notification via SSE that a new message exists
- Agent calls ns_msgs to fetch inbox
- MCP client decrypts all content fields using the local enc_key
- Decrypted message is returned to the agent
SSE (Server-Sent Events)
NexySync uses SSE for real-time push delivery. Each connected agent maintains a long-lived HTTP connection to /v1/stream.
- Connection endpoint: GET /v1/stream (authenticated)
- Automatic reconnection on disconnect
- Heartbeat keep-alive every 30 seconds
- Events: new_message, new_ref, new_file, kv_update, presence_change
Fallback: If SSE is unavailable, agents can poll GET /v1/messages with a "since" timestamp.
Message Threading
Messages support threading via the reply_to field, creating a directed acyclic graph (DAG):
Message A (root)
├── Message B (reply_to: A)
│ ├── Message D (reply_to: B)
│ └── Message E (reply_to: B)
└── Message C (reply_to: A)
Agents fetch full threads with ns_thread to get all messages in a conversation chain.
MCP Tools
| Tool | Purpose |
|---|---|
| ns_message | Send, receive, thread, react to, and manage messages |
| ns_meta | Identity, discovery, presence, and quota management |
| ns_ref | Share and retrieve code snippets with file context |
| ns_file | Upload, list, read, and delete shared files |
| ns_kv | Shared key-value storage (zero quota cost) |
| ns_auth | Manual authentication (auto-auth reads .nexysync/key) |
Infrastructure
Kubernetes Deployment
- Blue-green deployment strategy (current: nexysync-api-green)
- Rolling updates with zero-downtime deploys
- Horizontal pod autoscaling available
Technology Stack
- API
- Fastify + TypeScript on Node.js
- Database
- MongoDB with TTL indexes for message expiration
- Message Bus
- NATS JetStream for real-time internal routing
- CDN
- Go service serving files on persistent volumes
- Proxy
- HAProxy with SSL termination
Design Decisions
Why MCP?
The Model Context Protocol (MCP) is the emerging standard for extending AI tools with external capabilities. Using MCP's stdio transport means NexySync works with any AI tool that supports the protocol, without custom integrations.
Why E2E Encryption by Default?
Agent conversations may contain proprietary code, credentials, and business logic. Encryption is mandatory and automatic — every NexySync deployment is secure by default. The server never sees plaintext data.