Paste a Python or Node handler. Get a public HTTPS URL. No Dockerfile, no repo, no per-invocation pricing. Scale to zero when idle, wake on the next request.
Free tier includes 1 function. No credit card.
def handler(event):
name = event["query"].get("name", "world")
return {
"statusCode": 200,
"body": {"message": f"Hello, {name}!"},
}
Paste code, pick a runtime, deploy. Get a public HTTPS endpoint instantly.
A handler is enough for more than you'd think.
Catch Mollie, Stripe or GitHub events, verify the signature, update your database. The URL is stable, TLS is handled, and retries hit a warm VM.
A slash command is one POST handler: parse, act, reply. No server idling between messages, and warm responses land well inside Slack's timeout.
Give Claude, Cursor or Mistral a tool that actually does something. One handler is a full MCP server - the pattern is right below.
That one endpoint your frontend needs - a currency conversion, a geo lookup, a signed upload URL. Too small for a repo, perfect for a handler.
Contact forms on static sites need somewhere to POST. Validate, forward to your inbox or CRM, return 200. Done before your coffee cools.
Fetch from one API, reshape, push to another. Your logic in real code - versioned, testable, and not priced per task by an automation SaaS.
The things that come up the moment you deploy something real.
Every function runs in its own micro-VM with hardware-level isolation, not in a shared container runtime. A pool of pre-booted VMs sits in front, so cold starts land in about half a second and warm requests in the low hundreds of milliseconds.
Your function runs in Germany, Finland or France. No data ever leaves the EU. We publish the full sub-processor list, GDPR DPA available on request.
When a function fails on cold start, the dashboard shows you the captured stderr inline, next to the failing request. No grepping through a log tail in another tab to find the import error.
Built-in test console. Pick a method, set headers and a body, hit invoke. See the response and the timing without pulling out curl. Live logs stream in another tab.
Scale-to-zero usually means the logs die with the instance. Here every run is captured as a durable stream - when a function winds down, its logs stay in the dashboard, retained per plan.
Every function is public or key-protected, your choice per function. The platform enforces the key before your handler runs, so auth never lands in your code - or in your git history.
The Model Context Protocol turns any HTTP endpoint into a tool an LLM agent can call. The handler below is a complete MCP server - and it's deployed, so you can invoke it right here.
Browse all MCP servers on CodebergAn MCP server is just an HTTP endpoint that answers two JSON-RPC methods: tools/list (what can you do?) and tools/call (do it). That fits in one handler.
If you've written a cloud function before, this is the same shape: an event in, a JSON response out. Paste it, get a URL, and every MCP client can use it as a tool.
# A complete MCP server. Hand the URL to Mistral,
# Claude or Cursor as a tool - no SDK, no session state.
TOOL = {
"name": "scrape",
"description": "Fetch a URL and return cleaned text.",
"inputSchema": {"type": "object", "properties": {
"url": {"type": "string"},
}},
}
def handler(event):
req = json.loads(event["body"] or "{}")
if req["method"] == "tools/list":
return rpc(req["id"], {"tools": [TOOL]})
if req["method"] == "tools/call":
text = scrape(req["params"]["arguments"]["url"])
return rpc(req["id"], {"content": [
{"type": "text", "text": text},
]})
Public callers see an opaque error. The dashboard shows you exactly what crashed, with the captured traceback.
{
"error": "function_crashed",
"message": "Function exited before becoming ready",
"function": "fn-mollie-webhook",
"request_id": "8f2a4e1b-7c93-4d5e-a6f1-...",
"diagnostics": {
"stage": "cold_start",
"duration_ms": 412,
"exit_code": 1
}
}No file paths, library versions or traceback. Safe to expose on a public function URL.
Traceback (most recent call last):
File "/app/handler.py", line 4, in <module>
MOLLIE_KEY = os.environ["MOLLIE_API_KEY"]
~~~~~~~~~~^^^^^^^^^^^^^^^^^^
KeyError: 'MOLLIE_API_KEY'Flat plan price. Whether your functions handle a thousand or a hundred million requests this month, the bill is the same.
See what each plan includes →Free tier, no credit card. Sign up, paste a handler, get an HTTPS URL.
Get started free