import json, sys
def handle(req):
if req["method"] == "describe":
return {"name": "hello", "tools": [{"name": "echo", "parameters": []}]}
if req["method"] == "call":
return {"output": "hello, anna"}
for line in sys.stdin:
req = json.loads(line)
sys.stdout.write(json.dumps({"jsonrpc": "2.0", "id": req["id"], "result": handle(req)}) + "\n")
sys.stdout.flush()
Build the AI-native
apps people live inside.
Tools, Skills, and Anna Apps that any conversation can call by name. An open protocol, a curated runtime, and a distribution surface that already talks to your users every day.
Three building blocks. Endless agent surfaces.
Pick the surface that fits the job. Combine them when it doesn’t.
Executa
Standalone JSON-RPC plugins that the LLM can call. Implement describe + call, ship in any language.
weather.lookup, github.search_issues
Learn more →
SKILL.md
Declarative capability cards. A folder, a markdown file, and the agent gets a new superpower — no compiler, no daemon.
e.g.chart-generator, pdf-tools
Learn more →
Anna App
A curated bundle: tools + skills + behavior. Users install once and #mention the whole experience in chat.
weekly-review-coach
Learn more →
Hello, Executa.
A minimal plugin in three flavors. Copy, paste, run — the agent picks it up on the next turn.
const readline = require("readline");
const rl = readline.createInterface({ input: process.stdin });
rl.on("line", line => {
const req = JSON.parse(line);
const result = req.method === "describe"
? { name: "hello", tools: [{ name: "echo", parameters: [] }] }
: { output: "hello, anna" };
process.stdout.write(JSON.stringify({ jsonrpc: "2.0", id: req.id, result }) + "\n");
});
package main
import ("bufio"; "encoding/json"; "os")
func main() {
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
var req map[string]any; _ = json.Unmarshal(s.Bytes(), &req)
res := map[string]any{"output": "hello, anna"}
if req["method"] == "describe" { res = map[string]any{"name": "hello", "tools": []any{}} }
json.NewEncoder(os.Stdout).Encode(map[string]any{"jsonrpc": "2.0", "id": req["id"], "result": res})
}
}
A single round-trip from chat to your code.
The user types. Anna picks the right tool. Your process answers on stdout. Streaming tokens flow back. No webhooks, no servers, no glue.
github.search_issues…
// stdin
{ "jsonrpc": "2.0", "id": 7,
"method": "call",
"params": {
"name": "search_issues",
"args": { "q": "is:open created:>7d" }
} }
// stdout
{ "jsonrpc": "2.0", "id": 7,
"result": {
"output": [
{ "title": "Auth flow flake",
"url": "https://…" }
]
} }
Anatomy of an Anna App
Every published App is a manifest pointing at a curated set of capabilities.
Ship once. Reach every conversation.
Every published Anna App lights up across the surfaces users already use — no separate front-ends to maintain.
Inline in chat
Users type #your-app and your tools become first-class citizens of the next reply.
Anna App Store
Listed, searchable, reviewed. Versioned releases with changelogs and pricing.
Embedded UI
Render a window, a sidebar, or a full canvas via the Anna App UI bundle — HTML, JS, CSS.
Background skills
SKILL.md cards trigger when intent matches — the agent acquires a new ability without a redeploy.
Everything you need to ship.
Examples Repository
Working plugins in Python, Node.js, and Go — credentials, OAuth, binary builds.
GuideApp Store Guide
From manifest to published listing — the end-to-end Anna App workflow.
CommunityDeveloper Forum
Ask questions, share what you're building, propose protocol changes.
ReferenceDeveloper API
HTTP endpoints for managing Anna Apps, versions, reviews, and listings.
Ready to publish?
Apply for verified developer status and list your apps in the Anna App Store. Reach the conversations already happening.