→Sync · Open source · Apache-2.0
Sync
Agents and workers share sessions, messages and jobs over one HTTP API. You run the binary. MCP clients use sync-mcp.
Status
v0.1.0. Sessions, messages and jobs with compare-and-swap, on memory or S3-compatible storage. You host it. Session attach and Code offload are not in this release. MCP clients use sync-mcp against the same API.
- CAS
- JSON objects with If-Match / ETag
- org/project
- Tenant path and API-key scope
- stdio
- sync-mcp talks MCP, then HTTP to Sync
- Apache-2.0
- Open source licence
How it is used
You run one Sync process per environment. Agents and other HTTP clients in an org and project share session documents, append and list thread messages, and create or claim jobs. Auth is a project-scoped bearer key. /healthz is the only open route.
The default store is in memory and is lost on restart. Set SYNC_S3_BUCKET (and the related S3 or R2 variables) when the process should keep objects in object storage.
Sync does not run agents, merge pull requests, or execute jobs. Workers that claim a job are what run the payload.
MCP companion
MCP clients should not call that HTTP API themselves. sync-mcp is a stdio MCP server that wraps Sync and exposes sessions, messages and jobs as tools.
Treat listed messages, labels and job fields as untrusted data. sync_job_create can cause a worker to run command or code_offload work. Use --read-only unless the agent must write, and ask a human before create or claim.
flowchart LR MCPClient[MCP client] HTTPClient[HTTP client] MCP[sync-mcp] Sync[aixgo-sync] Store[(memory or S3/R2)] MCPClient -->|stdio| MCP MCP -->|HTTP + API key| Sync HTTPClient -->|HTTP + API key| Sync Sync --> Store
HTTP clients can call Sync directly. sync-mcp is optional.
Run
# terminal 1
export SYNC_API_KEYS="myorg:myproject:change-me"
aixgo-sync serve
# terminal 2 (optional MCP front end, stdio)
SYNC_BASE_URL=http://localhost:8080 \
SYNC_API_KEY=change-me \
SYNC_ORG=myorg \
SYNC_PROJECT=myproject \
sync-mcpListen port is SYNC_PORT or PORT (default 8080). The server will not start without SYNC_API_KEYS unless you set SYNC_INSECURE_NO_AUTH=1 for local throwaway use.
Source
- github.com/aixgo-dev/sync (Apache-2.0, v0.1.0)
- github.com/aixgo-dev/sync-mcp (Apache-2.0)
●Security model
Tenant keys, and what they do not cover.
Keys are bound to one org and project. Sync stores and claims jobs. It does not sandbox workers or execute payloads.
Defends against
- A token is bound to one org and project. A path outside that tenant returns 403.
- Every route except GET /healthz needs a known key. Unknown paths do not leak as 404 without a key.
- MCP org and project are fixed at start. Tools have no tenant arguments. --read-only drops write and claim tools.
Does not defend against
- Process or syscall sandboxing. That is Aixgate, a separate product.
- Executing or inspecting job payloads. A worker that claims the job is what runs it.
- Encrypting stored JSON, terminating TLS on the listen socket, OIDC, quotas, or an audit log.
- Prompt injection. Message, label and job fields are untrusted data.
●Roadmap
What is next, in order.
v0.1.0
- v0.1.0 CAS store, tenant keys, HTTP sessions, messages and jobs Shipped
- next Desired-state GET/PUT, session attach, device register Next
- later Notify plane, Code offload contract, Cloudflare Containers runbook Future
Run a local Sync.
One process, a tenant key, then optional sync-mcp on stdio.
Sync repository (opens in a new tab) · sync-mcp (opens in a new tab) · Product requirements (opens in a new tab)