a9script

Integrations and automations for systems with HTTP APIs

Deterministic execution. Probabilistic building.

Only the logic is code.

One place where the logic between your systems lives, runs and can be read. Every call is configured once and recorded as it runs; the code that remains is the business logic, in plain JS — written by your team or by an agent.

Join the betaRead the docs

The script — all of it
// A Jira issue was created: open its Linear issue and link the two.
const key = input.event.body.issue.key;
const issue = JiraGetIssue({ key });

const created = LinearCreateIssue({
  title: "[" + key + "] " + issue.summary,
  description: issue.description,
  teamId: input.settings.linearTeamId,
});

setMapping(input.settings.mappingNamespace, key, created.identifier);
log("linked", { jira: key, linear: created.identifier });

return { jira: key, linear: created.identifier, url: created.url };
A configured call after Test: the answer a script gets, and the request that was sent — the credential named, never shown.A configured call after Test: the answer a script gets, and the request that was sent — the credential named, never shown.
A configured call after Test: the answer a script gets, and the request that was sent — the credential named, never shown.

The teal names are your configured calls. The call leaves the platform; the credential, the retries, the pause on a throttle and the record of the request are the platform's. What Test shows is what your script gets.

Only the logic is code

Retries, throttling, token refresh and paging are configuration. So are the texts, the mail bodies, the mappings and the prompts. Each part is tested on its own before a script exists — and a change to a text or a mapping is a configuration change your support engineer makes, not a code change.

Learn more about configured calls →
KindWhat leaves the code
httpOne call to an HTTP API: configured in a minute, tested at once, called by name.
textEvery text a script produces — a comment, a message, a file name — lives outside the code.
emailA mail's subject, body and attachments, owned by the person who owns the wording.
csvCSV in, records out — or the other way round — with the result of a sample shown as you type.
jsonmapOne JSON shape into another, declared once, with the result of a sample shown as you type.
llmEverything about a call to a model in one place: the prompt, the model, the key it never shows.

One place for every connection

A connection holds the address and the credential; a script never sees a secret. The same code runs in sandbox and production. Webhook senders are pre-configured, and an endpoint can be an API for other applications or an MCP server for assistants — with your own users signed in.

Learn more about connections →
The explorer beside a connection: the address of a system, who you are to it, and the endpoints it answers on.The explorer beside a connection: the address of a system, who you are to it, and the endpoints it answers on.
The explorer beside a connection: the address of a system, who you are to it, and the endpoints it answers on.

Runs that finish

The night job completes. A throttle is a pause, not a failure. A call that was made is never made twice: every run is written down as it goes, continues where it stopped, can be stepped through in a sandbox, and can be read afterwards.

Learn more about runs →
A traced test run: every call that left the platform, with what it sent and what came back.A traced test run: every call that left the platform, with what it sent and what came back.
A traced test run: every call that left the platform, with what it sent and what came back.

Built fast, by hand or by agent

An agent builds an integration alone: it probes a call, writes a folder, applies it, runs it with a trace and reads what came back. It never holds a credential, and what it produces stays small enough for a person to read.

Learn more about building with agents →
The loop, from a terminal or over MCP
a9script probe JiraGetIssue --input '{ "key": "KAN-9" }'
a9script apply ./jira-to-linear --dry-run
a9script apply ./jira-to-linear
a9script run j2l-on-issue --debug
a9script history --json

Runs at scale

Thousands of records a night, matched across systems without a spreadsheet of ids. Large files never break your script. Work is queued fairly across tenants, every tenant runs under ceilings, and your own users sign in at your endpoints.

Learn more about scale →
WhatWhere it goes
RecordsStaged in a dataset and worked in bounded pieces; a pause keeps the place.
IdsMapped once per record, in the integration store, read by every later run.
FilesHeld by the platform; a script carries a handle, never the bytes.
LoadOne fair queue across tenants; ceilings per tenant and per environment.
PeopleYour own users, invited by mail, signed in at your endpoints.

MCP in both directions

An assistant can build on the platform, and an assistant can use what you built on it. The credential stays on the platform's side both times.

Build over MCP

The authoring surface speaks MCP: an assistant with a token bound to one environment probes, applies, runs and inspects — the same rules a person at the keyboard gets.

Serve over MCP

An endpoint set to MCP lists the calls you configured as tools, each with a generated schema. Your legacy REST API becomes callable by an assistant without a server written.

How an endpoint becomes an MCP server →

Jira to Linear, built by an agent

An agent was asked to connect a Jira project to a Linear team: a new issue opens a Linear issue, comments and status changes follow it, and an hourly check closes the loop back into Jira. It used the connections and the endpoint that already existed, changed nothing that was there, and reported what it could not verify. The session is the case study.

Read the case study →

Get your own tenant

The beta gives you a tenant with a sandbox and a production environment, your own users, and the documentation on this site. Write to us and we answer within two working days.

Join the betaEverything it does