Write an App Intent in TypeScript, ship it to Siri.
The open-source compiler that turns one defineIntent() call into two agent surfaces:
a native Swift App Intent for Siri — and an MCP tool for Claude, Cursor, and Windsurf.
Website · Playground · Quick Start · MCP Server · Discussions
WWDC 2026 is weeks away. Apple is expanding App Intents as the universal action layer across iOS 26, macOS Tahoe, and Apple Intelligence — every App Intent you ship becomes a capability that Siri, Shortcuts, Spotlight, and on-device AI agents can invoke. The surface area is growing fast.
Axint is the fastest path from an AI coding tool to a shipped App Intent. One TypeScript definition. Two agent surfaces. Zero Swift required.
┌──────────────────────────────┐
│ defineIntent({ ... }) │ one TypeScript source
└──────────────┬───────────────┘
│ axint compile
┌───────┴────────┐
▼ ▼
┌─────────────┐ ┌──────────────┐
│ .swift │ │ MCP tool │
│ .plist │ │ (Claude, │
│ .entitl. │ │ Cursor, │
│ │ │ Windsurf) │
└─────────────┘ └──────────────┘
Siri, Shortcuts, Your AI
Spotlight, Agent coding agent
Siri, Apple Intel.
- Real TypeScript AST parser. Not regex. Uses the TypeScript compiler API, same as
tsc, so you get full type fidelity and proper diagnostics with line/column spans. - Native type fidelity.
int → Int,double → Double,float → Float,date → Date,url → URL,duration → Measurement<UnitDuration>,optional<T> → T?. Default values and optionality are preserved end-to-end. - Return-type-aware
perform()signatures. Every generated intent is a drop-in tool for Agent Siri and Shortcuts. - Info.plist and .entitlements emit. Axint writes the
NSAppIntentsDomainsplist fragment and the App Intents entitlement XML alongside your.swiftfile. Drop all three into Xcode and ship. - MCP-native. A bundled
axint-mcpserver exposes five tools —axint_scaffold,axint_compile,axint_validate,axint_list_templates, andaxint_template— to any MCP client. Your AI coding agent can read your project, draft a TypeScript intent, compile it, and open a PR — without a human touching Xcode. - Rust-grade diagnostics. 16 diagnostic codes (
AX001–AX202) with fix suggestions and color-coded output. - Sub-millisecond compile. A typical intent compiles in under a millisecond. The axint.ai playground runs the full compiler in your browser with zero server round-trip.
- 155 tests. Parser, validator, generator, emit paths, watch mode, and sandbox — all covered.
- Apache 2.0, no CLA. Fork it, extend it, ship it.
# Install globally
npm install -g @axintai/compiler
# Or use without installing (runs from npm cache)
npx -p @axintai/compiler axint compile my-intent.ts --stdoutCreate my-intent.ts:
import { defineIntent, param } from "@axintai/compiler";
export default defineIntent({
name: "CreateEvent",
title: "Create Calendar Event",
description: "Creates a new event in the user's calendar.",
domain: "productivity",
params: {
title: param.string("Event title"),
date: param.date("Event date"),
duration: param.duration("Event duration", { default: "1h" }),
location: param.string("Location", { required: false }),
},
perform: async ({ title, date, duration, location }) => {
return { success: true };
},
});Compile it:
axint compile my-intent.ts --out ios/Intents/You get three files ready to drop into Xcode:
ios/Intents/
├── CreateEventIntent.swift # AppIntent struct
├── CreateEventIntent.plist.fragment.xml # NSAppIntentsDomains
└── CreateEventIntent.entitlements.fragment.xml # App Intents entitlement
For iterative development, axint watch recompiles on every save with sub-millisecond rebuilds:
# Watch a single file
axint watch my-intent.ts --out ios/Intents/
# Watch a directory of intents
axint watch ./intents/ --out ios/Intents/ --emit-info-plist --emit-entitlements
# With swift-format
axint watch my-intent.ts --out ios/Intents/ --format
# Auto-run swift build after each compile
axint watch ./intents/ --out ios/Intents/ --swift-build
# Specify the Swift project root (defaults to --out parent)
axint watch ./intents/ --out ios/Sources/Intents/ --swift-build --swift-project ios/The watcher runs an initial compile pass, then re-triggers on file changes with a 150ms debounce. Errors are reported inline without killing the process — fix the file and it recompiles automatically. With --swift-build, each successful compile triggers swift build in the project directory so you get immediate feedback on whether the generated Swift compiles cleanly.
// CreateEventIntent.swift
// Generated by Axint — https://github.com/agenticempire/axint
// Do not edit manually. Re-run `axint compile` to regenerate.
import AppIntents
import Foundation
struct CreateEventIntent: AppIntent {
static let title: LocalizedStringResource = "Create Calendar Event"
static let description: IntentDescription = IntentDescription("Creates a new event in the user's calendar.")
@Parameter(title: "Event title")
var title: String
@Parameter(title: "Event date")
var date: Date
@Parameter(title: "Event duration")
var duration: Measurement<UnitDuration> = .init(value: 1, unit: .hours)
@Parameter(title: "Location")
var location: String?
func perform() async throws -> some IntentResult & ReturnsValue<String> {
// TODO: Implement your intent logic here.
// Parameters available: \(title), \(date), \(duration), \(location)
return .result(value: "")
}
}Four passes. Zero Xcode.
- Parse — TypeScript
defineIntent({ ... })calls are parsed with the real TypeScript compiler API (not regex) into a typed intermediate representation. - Validate — 16 diagnostic codes (
AX001–AX202) catch invalid App Intent shapes before Swift ever sees them. Return-type inference and default-value sanity checks included. - Generate — Idiomatic Swift is emitted:
AppIntentconformance,@Parameterdecorators,LocalizedStringResourcetitles, return-type-awareperform(). - Emit — An Info.plist XML fragment (for
NSAppIntentsDomains) and a.entitlementsXML fragment (for the App Intents entitlement) are written alongside the Swift file.
Axint ships with axint-mcp, a Model Context Protocol server that exposes the compiler to any MCP-compatible LLM client — Claude Desktop, Claude Code, Cursor, Windsurf, and others.
// ~/.config/claude/mcp.json or equivalent
{
"mcpServers": {
"axint": {
"command": "axint-mcp",
"args": []
}
}
}Five tools are exposed:
| Tool | What it does |
|---|---|
axint_scaffold |
Generates a TypeScript intent from a natural-language description |
axint_compile |
Runs the full pipeline and returns .swift + .plist + .entitlements |
axint_validate |
Dry-run validation with line/column diagnostics |
axint_list_templates |
Lists all bundled intent templates |
axint_template |
Returns the source of a specific bundled template |
Once connected, your AI coding agent can read a Swift project, draft an intent, compile it, and open a PR — without a human touching Xcode.
| TypeScript | Swift | Default value support |
|---|---|---|
string |
String |
✓ |
int |
Int |
✓ |
double |
Double |
✓ |
float |
Float |
✓ |
boolean |
Bool |
✓ |
date |
Date |
— |
duration |
Measurement<UnitDuration> |
✓ (e.g. "1h") |
url |
URL |
— |
optional<T> |
T? |
✓ |
| Axint | Hand-written Swift | |
|---|---|---|
| Lines of code | 12 lines of TypeScript | 30+ lines of Swift boilerplate |
| Time to first intent | ~30 seconds | 10–15 minutes |
| Type marshaling | Automatic | Manual (easy to mistype) |
| Info.plist fragment | Emitted | Hand-written |
| Entitlements fragment | Emitted | Hand-written |
| Validation | 16 diagnostic codes | Runtime bugs |
| MCP integration | Built-in server | Manual setup |
| Refactoring | Change TS, recompile | Change Swift in every file |
Rust-grade error messages with fix suggestions:
error[AX100]: Intent name "sendMessage" must be PascalCase
--> src/intents/messaging.ts:5:9
|
5 | name: "sendMessage",
| ^^^^^^^^^^^^^
= help: rename to "SendMessage"
warning[AX105]: Intent has 12 parameters. Apple recommends 10 or fewer.
--> src/intents/complex.ts:3:1
= help: consider splitting into multiple intents
See docs/ERRORS.md for the full reference.
No install required: axint.ai/#playground runs the entire compiler in-browser — parser, validator, generator, and emit — with zero server round-trip.
- Node.js 22+
- Any OS: macOS, Linux, Windows
- Xcode 15+ (only if you want to ship the generated Swift to an Apple platform)
- Target platforms: iOS 17+, iPadOS 17+, macOS 14+; Agent Siri requires iOS 26.1+ / macOS Tahoe 26.1+
axint/
├── src/
│ ├── core/ # Parser, validator, generator, compiler, emitter, IR
│ ├── sdk/ # defineIntent() API and param helpers
│ ├── mcp/ # MCP server (scaffold, compile, validate)
│ ├── cli/ # axint CLI (Commander.js)
│ └── templates/ # Intent template registry
├── tests/ # 155 vitest tests
├── examples/ # Example intent definitions
└── docs/ # Error reference, contributing, assets
We review PRs within 48 hours. Good places to start:
- Browse issues labeled
good first issue - Add an intent template for a common use case (messaging, health, commerce)
- Improve diagnostics with better fix suggestions
- Help wanted on the Xcode live-preview watch mode
See CONTRIBUTING.md. Apache 2.0, no CLA.
See ROADMAP.md for the full plan. Highlights:
- Real TypeScript AST parser (v0.2.0)
- Info.plist and
.entitlementsemit (v0.2.0) - Return-type-aware
perform()(v0.2.0) - MCP scaffold tool (v0.2.0)
- 155-test suite with snapshot coverage (v0.2.0+)
- Intent template library with 12+ templates (v0.3.0)
-
--watchmode with--swift-buildfor live recompilation (v0.3.0) - SPM build plugin — auto-compile during
swift build(v0.3.0) - Registry at registry.axint.ai (v0.3.0)
- GitHub template repo (
axint-starter) - Axint Cloud (hosted compilation)
Apache 2.0 — fork it, extend it, ship it. No CLA.
Built by Agentic Empire · axint.ai