lynko

Programmable shared environments for agents

Build the environment for the work once. Run any agent on it.

Connect your existing repos, docs, and sheets with capabilities, procedures, role-scoped access, and persistent working state. Different agents can work against the same live pod without reconstructing the environment for each one.

same live environment in
Claude CodeCodexanother MCP surface
pod / product-environment

Collections

srcsource code
docsengineering plans
drivecontracts + sheets
notesagent threads

Nodes

skillsdiscoverable playbooks
citest() gates
runnerrun() on your machine
embedsemantic search()
substrate contractone pod surface, scoped by role

Roles

authordraft + test + commit
reviewerread + inspect
devopsrun + checks
navigatedrafttestresume
1.6Btokens navigable
<200mstypical operation
1 URLto connect
12–54%est. billed-input savings · methodology

Token count and latency are live from the dashboard (30-day window). Savings are estimated per task on benchmarks against a strong native bash baseline.

One piece of work, end to end

From spec to tested change.

Shared working state lives in the pod, so the work can pass between harnesses without being rebuilt from a transcript. Every step below runs against the same handles. Roles make responsibilities visible; enforcement happens server-side on every call. Even the review findings live in the pod — the author reads them where the work is.

  1. Read the requirementplans[auth-timeouts.md].section("Timeout handling")
  2. Draft the change, dispatch the checksapi-server[src/handler.go].expand("Handler").draft.edit(...)api-server.test(targets="api")
  3. Hand it to a reviewerapi-server.invoke("codex", "reviewer", ...)Start in Claude. Resume in Codex.
  4. Verify, then publishrunner["run-…"].read() → ci["run-…"].ls() → commit(...)
role / author · draft + testclaude
> plans[auth-timeouts.md].section("Timeout handling")
> api-server[src/handler.go].expand("Handler").draft.edit(...)
> api-server.test(targets="api")
Run dispatched: run-… · Check: ci["run-…"].ls()
> api-server.invoke("codex", "reviewer",
    "Review the draft diff and flag risky changes")
Run dispatched: run-… · Check: runner["run-…"].read()
role / reviewer · read + inspectcodex · resumed
> api-server[src/handler.go].draft.diff()
--- a/src/handler.go
+++ b/src/handler.go
@@ -2,7 +2,8 @@
… 1 file(s), +2/-1
> ci["run-…"].ls()
Run [succeeded] · lint: api · test-unit: api
role / author · commitclaude · resumed
> runner["run-…"].read()
> api-server.commit("fix: handler timeout")
Committed and pushed · 6bf424f

Engine vs substrate

Models and harnesses change. The work environment stays.

Structural handles

State is addressable — sections, symbols, rows, and runs are durable handles that let any harness work at a precise scope. Important inputs, outputs, and state transitions stay addressable instead of becoming ad-hoc copies in a transcript.

Scoped pods

A pod assembles collections (data) and nodes (capabilities) into one surface. Each connection carries a role, so an agent gets exactly the access you grant.

Harness-neutral state

Any harness can target the same pod. The agent is swappable; the handles, drafts, and results stay put.

Pods and nodes

A pod is the live environment for a piece of work.

Each MCP connection uses one pod. Collections connect the organizational state agents work on; nodes add capabilities such as test(), run(), and search(). Roles scope authority, skills carry reusable procedures, and drafts, runs, and results keep working state available across sessions and harnesses.

Collections sync from GitHub, GitLab, and Google Drive — more sources coming. Lynko is the substrate, not the system of record. Your source stays authoritative; supported writes publish back to it.

Skills node

native:skills

Indexes qualified SKILL.md files across the pod so agents can discover, read, pin, and curate reusable playbooks.

CI node

native:ci

Adds test() so draft changes can be checked before they become committed state.

Runner node

native:runner

Adds run() for builds, smoke tests, and commands on a machine you connect over SSH.

Embedding node

native:embedding

Adds search() — semantic search over every qualified collection in the pod.

One URL to connect

Connect your client.

No config file — add one URL as a custom connector. The connection is scoped to one pod, so your agent sees that pod's collections and nodes, nothing else.

Custom connector URL

https://mcp.lynko.ai/mcp

Paste it into Claude, Codex, or Cursor as a custom connector — dynamic client registration handles the rest.

Early access

Build your agent environment on Lynko.

Connect one pod, add one MCP URL, and keep the same scoped state across every harness you use.

Request early access

Free during early access — we'll allowlist you within 24 hours.