← blog

A website an AI agent can use

My bet is that in a few years hardly anyone will visit websites. They'll send their assistant. So I built a site where an assistant can book a call with me without signing in and without an API An interface through which one program asks another for data or to do something. key. It took me a few evenings with Claude Code A program from Anthropic in which the Claude assistant works on files and code on your computer. and Codex An AI assistant from OpenAI that works on files on your computer: it reads and changes them and runs programs..

Why four ways in to one booking

Every tool with an AI assistant can do something different, so the same booking has four entrances:

  • The API (GET /api/v1/slots and POST /api/v1/bookings) is for agent A program built on an AI model that carries out tasks by itself, for example searching, clicking and saving. that can send requests, such as Claude Code, Codex or agent mode in ChatGPT.
  • A regular ChatGPT or Claude chat can only read pages. So every free slot has a ready booking_link that the assistant adds the person's details to, and the human clicks one button.
  • The form works without JavaScript A programming language that lets a web page react to clicks and change without reloading., so an agent driving a browser can fill it in too.
  • The MCP A standard that lets an AI assistant connect to apps, such as a calendar or a task list. at https://majlo.dev/mcp is for AI clients that can be connected to it.

What didn't work

What surprised me most was that a regular ChatGPT chat didn't see the site at all until it was indexing Adding a page to a search engine's list so that people can find it.. It either couldn't find it or wouldn't open it. It only opens addresses it knows from its search engine on its own, so the list of free slots is available to search engines. There is no guarantee for every ChatGPT tool.

For the same reason a regular chat won't send a GET and POST Two kinds of requests to a server: GET fetches data, POST sends data to be saved. and won't open an address it built itself from the person's details. With such a link ChatGPT shows a "Check this link is safe" warning, so the last click is made by a human.

How I keep spam out

Without sign-in anyone could enter someone else's address or grab all the slots. So:

  • A booking waits 30 minutes for a click in the email and goes into the calendar only after it. The link opens a page with a button, so a link scanner A program that opens the links from emails by itself to check whether they lead to something harmful. in the inbox won't confirm anything.
  • One address can have one active booking, so a single person can't take all the slots.
  • I reject about 97 thousand disposable domains Services that give a temporary email box without signing up, often so you do not have to give your real address. and addresses without an MX record An entry in a domain's settings that says where to deliver its email. Without it nothing arrives at that address., because the confirmation should reach a real inbox.
  • The client's topic goes into the calendar labelled "unverified" and capped at 500 characters. My ChatGPT reads that calendar, and text from a stranger could contain instructions for it.

For agents

The instructions are at majlo.dev/agents, with a short version in llms.txt. Every page also has a markdown A simple way of writing text with a few marks, such as # for a heading, easy to read for people and programs. version, you just send the header A note at the start of a request to a server that says how to answer, for example in which format. Accept: text/markdown.