The web gave humans a universal surface for information. String aims to give AI agents a universal surface for work — one interface to read, navigate, act, and edit across documents, apps, and the web.
Drop this URL into your AI agent →string-os.org/skill.md Today's agent tooling is islands. MCP, function calling, every framework lives in its own world. Each integration is a code project; each tool has its own shape. The agent learns each one separately, and pays for the schema in every call.
String's bet is simpler. Every capability — a document, an app, a remote URL, an editable file — gets the same shape. The agent reads a markdown file the way it reads a webpage. Actions live inline. Navigation is by link. State is scoped per topic. New capability = new markdown file. No host config, no restart, same interface in any agent.
Different domains an agent works against — the same primitives address them all.
/open file.md /act.<name> /open https://… /edit · /write /exec · act.cli Below: a weather app — the entire app — and an agent session calling it. The agent reads the same file you do.
---
name: weather
type: app
default: now
---
# Weather
```act.now
GET https://wttr.in/{city}?format=%l:+%c+%t
city, -c: string (required) "City name"
```
```act.forecast
GET https://wttr.in/{city}?format=j1
city: string (required) "City name"
days: number (optional) "Days to forecast" = "3"
``` $ string app:weather '/act.now --city Seoul'
<𝒞=string:app:weather>
Seoul: ☀️ +23°C
</𝒞>
$ string app:weather '/act.forecast --city Tokyo --days 5'
<𝒞=string:app:weather>
Tokyo, 5-day forecast:
Mon: ☀️ +28°C
Tue: 🌤 +27°C
Wed: 🌧 +22°C
Thu: ⛅ +25°C
Fri: ☀️ +29°C
</𝒞> The agent reads it, installs String, and starts using apps. No SDK, no protocol negotiation, no per-agent integration code.
https://string-os.org/skill.md
Or install directly (for humans driving String themselves):
npm install -g @string-os/string
Numbers from early benchmarks comparing equivalent task completion across MCP, function calling, and String. Methodology in the docs.
Same primitives. Same shape. The agent learns String once and uses everything.