Now in Private Beta

Ship Functions.
Agents Trust Them.

The platform for AI-accessible functions. Publish in Python, Go, Rust, JavaScript, or WebAssembly — then let agents discover, call, and trust your tools with full observability, sandboxed execution, and policy controls built in.

Multi-lang Python, Go, Rust, JS, WASM
Isolated Wasm + WASI per-request sandbox
Trust-scored execution + routing

Who benefits most from FunctionFly

From solo founders to enterprise teams, FunctionFly provides the reliability and flexibility you need to focus on building great products.

Indie SaaS Founder

Deploying your first app

You built an amazing product and now need trustworthy agent tooling without enterprise overhead. FunctionFly gives you multi-language functions, sandboxed execution, trust signals, and a path to scale safely.

  • Python, Go, Rust, JS, WASM support
  • Wasm + WASI sandbox isolation
  • Trust scores and verification tiers
  • Pay as you grow

Growing Startup

Scaling agent + API workloads

Your team is shipping fast and agents are calling more tools every week. You need policy-friendly trust metadata, attestations, and execution-backed signals—not a pile of unvetted endpoints.

  • Multi-level verification workflows
  • Agent swarm orchestration
  • Policy engine for safe agent execution
  • Multi-provider routing (CF, Fly.io, custom)

Enterprise

Governance and compliance

Your organization needs auditability, least-privilege access to tools, and consistent trust policies across agents and teams. Firecracker MicroVMs, attestations, and policy enforcement — without rewriting how you think about risk.

  • Firecracker MicroVMs for CPython workloads
  • Multi-level verification and attestations
  • Custom SLAs, priority support, and audit logs
  • Multi-team and multi-app patterns

Everything agents need to call your functions safely

Publish once. Agents everywhere can discover, trust, and execute your tools — with full isolation and observability built in.

Multi-language Functions

Publish in Python, Go, Rust, JavaScript, or WebAssembly. One SDK, every runtime — no rewrites when you switch languages.

Sandboxed Execution

Firecracker MicroVMs isolate every function call. Memory and CPU enforced at the hardware level — not containers.

Execution Trace & Trust Scores

Agents get history-backed trust signals so “works” and “safe” are distinguishable and policy-driven.

Agent Swarms

Spawn child agents, orchestrate messaging, evolve behavior over time, and schedule multi-agent tasks — all with quota controls.

Policy Engine

Execution depth limits, recursion guards, wall-time caps, and memory constraints — so agents cannot go rogue on your infrastructure.

Multi-Provider Routing

Route function calls across Cloudflare Workers, Fly.io, and custom backends — with trust-based selection and budget enforcement.

From code to trusted agent tool in four steps

FunctionFly handles verification, isolation, routing, and observability — so you can focus on writing business logic.

01

Write

Implement your function in Python, Go, Rust, JavaScript, or TypeScript. Your code runs in isolation — it cannot phone home or access the filesystem unless you grant capabilities explicitly.

02

Publish

Run ffly deploy. FunctionFly bundles your code, compiles it for the target runtime, signs the artifact, and runs multi-level verification checks before making it live.

03

Discover

Agents find your function through manifests and trust filters. Your function's trust score, verification tier, execution history, and capability declarations are all surfaced automatically.

04

Execute

Agents call your function over HTTPS. FunctionFly routes to the right backend, enforces policy limits, runs in a Wasm sandbox, and records every result for trust scoring.

Your function, any language

Write once. Select your runtime at publish time — FunctionFly handles compilation, bundling, and isolation.

# functionfly.config.jsonc
{"name": "calculate-risk-score",
  "runtime": "python",
  "capabilities": ["kv:read", "fetch:read"]
}

# risk_score.py
import json
from functionfly import context, kv

async def handle(input: dict) -> dict:
    user_id = input["user_id"]
    history = await kv.get(f"risk:{user_id}")
    score = compute_score(history or [])
    return {"score": score, "band": band(score)}
// functionfly.jsonc
// {"name": "forward-email", "runtime": "go", "capabilities": ["email:send"]\}

package functionfly

import (
  "context"
  "encoding/json"
  fly "github.com/functionfly/functionfly/sdk/go"
)

type Input struct {
  To      string `json:"to"`
  Subject string `json:"subject"`
  Body    string `json:"body"`
}

func Handle(ctx context.Context, input Input) (any, error) {
  return map[string]any{
    "sent":   true,
    "to":     input.To,
    "msg_id": ctx.Value(fly.TraceIDKey),
  }, nil
}
// functionfly.jsonc
// {"name": "mnemonic-check", "runtime": "wasm", "capabilities": []\}

use functionfly::prelude::*;

#[fnfly::function]
pub fn validate_mnemonic(phrase: String) -> MnemonicResult {
  let words: Vec<String> = phrase.split_whitespace().map(String::from).collect();
  MnemonicResult {
    valid: words.len() == 24 && words.iter().all(is_valid_word),
    word_count: words.len() as u32,
  }
}
// functionfly.config.jsonc
// {"name": "scrape-metadata", "runtime": "node20", "capabilities": ["fetch:read"]\}

export async function handle(input) {
  const { url } = input;
  const res = await fetch(url);
  const html = await res.text();
  return {
    title: extract("<title>(.*?)</title>", html),
    description: extract(`<meta name="description" content="(.*?)">`, html),
  };
}
// functionfly.config.jsonc
// {"name": "raroc-calculate", "runtime": "node20", "capabilities": ["kv:read", "kv:write"]\}

import { kv } from "functionfly";

interface RAROCInput {
  pd: number;
  lgd: number;
  ead: number;
  corr: number;
}

export async function handle(input: RAROCInput): Promise<RAROCResult> {
  const key = `raroc:${hash(input)}`;
  const cached = await kv.get(key);
  if (cached) return JSON.parse(cached);
  const result = computeRAROC(input);
  await kv.set(key, JSON.stringify(result), { ttl: 3600 });
  return result;
}

Capabilities — what your function can and cannot do

Sandbox isolation means every function runs with zero implicit permissions. Capabilities are declared at publish time and enforced at runtime — there is no ambient authority.

Explicitly granted — declare in functionfly.jsonc
Deny-by-default — function cannot access this unless re-deployed with updated capabilities

Network

  • granted fetch:read — outbound HTTPS GET
  • granted fetch:write — outbound HTTPS POST/PUT/PATCH
  • denied websocket — persistent connections

Storage

  • granted kv:read — read from key-value store
  • granted kv:write — write to key-value store
  • denied storage:* — any other storage access

Communication

  • granted email:send — send transactional email
  • granted agent:message — inter-agent messaging
  • denied notification:push — push notifications

Execution

  • granted function:invoke — call other functions
  • granted agent:spawn — spawn child agents (Enterprise)
  • denied exec:* — shell or subprocess execution

Full observability, every execution

Execution traces, trust scores, and metrics — so you know exactly what your agents are doing.

Execution Traces

Every function call is recorded with input, output, latency, cost, and the full call stack. Trace a single execution from agent prompt to function result.

Trust Score History

Trust scores are computed from real execution outcomes — not static analysis. High trust means a proven track record of correct results.

Latency and Cost Metrics

P50, P95, P99 latency per function. Cost per execution in USD. Set budget alerts and get notified before quotas hit.

Verification Audit Log

Every verification submission, artifact signing, revocation event, and level change is logged immutably. Exportable to your SIEM.

Why teams switch to FunctionFly

Other options leave agents flying blind. We give them the trust infrastructure they need.

Raw API Endpoints Traditional FaaS
Lambda, Cloud Functions
FunctionFly
Agent-discoverable manifests
Trust scores
Multi-level verification
Wasm sandbox isolation ⓘ DIY
Firecracker VMs (Enterprise)
Signed attestations
Capability-based security
Agent swarm orchestration
Multi-provider routing ⓘ Manual
Policy engine
Execution traces + audit log ⓘ Basic ⓘ Cloud logs

Publish a function in minutes

Initialize, configure, deploy, and let agents start calling it — with trust scores computed automatically.

# Install
$ brew install functionfly/tap/ffly
# or
$ curl -fsSL https://raw.githubusercontent.com/functionfly/fly/main/scripts/install.sh | bash
# or
$ go install github.com/functionfly/fly/cmd/ffly@latest
# Authenticate
$ ffly login
# Initialize a new function
$ ffly init my-function
# Publish with verification
$ ffly deploy
🚀 Published verified & signed tool!
🧾 Verification: Level 2+
# Install
$ curl -fsSL https://raw.githubusercontent.com/functionfly/fly/main/scripts/install.sh | bash
# or
$ go install github.com/functionfly/fly/cmd/ffly@latest
# Authenticate
$ ffly login
# Initialize a new function
$ ffly init my-function
# Publish with verification
$ ffly deploy
🚀 Published verified & signed tool!
🧾 Verification: Level 2+
# Install (requires Go 1.25+)
$ go install github.com/functionfly/fly/cmd/ffly@latest
# or download from GitHub Releases
# Authenticate
$ ffly login
# Initialize a new function
$ ffly init my-function
# Publish with verification
$ ffly deploy
🚀 Published verified & signed tool!
🧾 Verification: Level 2+

The ffly CLI is installed via Homebrew, the shell installer (curl -fsSL https://raw.githubusercontent.com/functionfly/fly/main/scripts/install.sh | bash), go install, or GitHub Releases — not as an npm package.

The platform your agents actually need

Start free. Multi-language support, sandboxed execution, trust scoring, and full observability — so agents can call your functions with confidence.

Join the waitlist for early access to new features