{"services":[{"service":"apps","description":"Small self-contained web tools, built and run in place","scoped":false,"methods":[{"method":"Build","path":"/api/v1/apps/build","doc":"Build a small app from a description, save it, and return its details and URL. An app is a single page — a tracker, a checklist, a counter — that keeps its own store and runs in the browser","cost":"app_build","needs_auth":false},{"method":"Create","path":"/api/v1/apps/create","doc":"Create an app — a small, self-contained HTML tool hosted here. Takes the HTML; apps_build writes it for you from a description","cost":"app_create","needs_auth":false},{"method":"Edit","path":"/api/v1/apps/edit","doc":"Edit an app you own — its name, description, tags, icon, HTML or price. Fields left out keep their value","cost":"app_edit","needs_auth":false},{"method":"Fork","path":"/api/v1/apps/fork","doc":"Fork an app into your own account, to change independently of the original","needs_auth":false},{"method":"Read","path":"/api/v1/apps/read","doc":"Read the details of one app by its slug","needs_auth":false},{"method":"Run","path":"/api/v1/apps/run","doc":"Publish a snippet of JavaScript and get back a URL that runs it in a browser. It returns a link rather than output — the code runs in a sandbox when somebody opens it, not here","cost":"agent_query","needs_auth":false},{"method":"Search","path":"/api/v1/apps/search","doc":"Search the apps directory for small, useful tools, by name, description or tag","needs_auth":false},{"method":"Test","path":"/api/v1/apps/test","doc":"Test an app by checking its HTML and running its mu.api calls server-side, so an author finds out what is broken without opening it","needs_auth":false}]},{"service":"blog","description":"Microblogging with AI-generated daily digests, federated over ActivityPub","scoped":false,"methods":[{"method":"Create","path":"/api/v1/blog/create","doc":"Publish a post to the caller's blog. For anything meant to be read later by other people — notes, write-ups, announcements. For a private note to yourself, prefer files or memory","cost":"blog_create","needs_auth":false},{"method":"Delete","path":"/api/v1/blog/delete","doc":"Delete one of the caller's own blog posts, by id or title. Refuses posts written by anyone else, and refuses an ambiguous title rather than guessing. Irreversible, so confirm with the user first","destructive":true,"needs_auth":false},{"method":"List","path":"/api/v1/blog/list","doc":"Read recent blog posts — titles, snippets and ids","needs_auth":false},{"method":"Read","path":"/api/v1/blog/read","doc":"Read one blog post in full, by id or by title. Use after blog_list has found a candidate and the summary is not enough","needs_auth":false},{"method":"Update","path":"/api/v1/blog/update","doc":"Edit one of the caller's own posts. Fields left out keep their current value","needs_auth":false}]},{"service":"chat","description":"Live discussion rooms attached to an item","scoped":false,"methods":[{"method":"Messages","path":"/api/v1/chat/messages","doc":"Read the recent conversation in a discussion room","needs_auth":false},{"method":"Rooms","path":"/api/v1/chat/rooms","doc":"List discussion rooms that currently have activity","needs_auth":false},{"method":"Send","path":"/api/v1/chat/send","doc":"Say something in a discussion room, as the caller. Use chat_rooms to find the room id","needs_auth":false}]},{"service":"contacts","description":"The caller's own address book: turn a name into an address","scoped":true,"methods":[{"method":"Add","path":"/api/v1/contacts/add","doc":"Save someone to the address book. Adding a name already there updates it rather than making a second card","needs_auth":true},{"method":"Delete","path":"/api/v1/contacts/delete","doc":"Remove someone from the address book","destructive":true,"needs_auth":true},{"method":"Find","path":"/api/v1/contacts/find","doc":"Look someone up in the address book by name, part of a name, or address. Use this before sending mail to a person named rather than addressed","needs_auth":true},{"method":"List","path":"/api/v1/contacts/list","doc":"List everyone in the caller's address book","needs_auth":true}]},{"service":"docs","description":"Your own documents — write, keep and come back to them","scoped":true,"methods":[{"method":"Delete","path":"/api/v1/docs/delete","doc":"Delete one of your documents, by id","destructive":true,"needs_auth":true},{"method":"List","path":"/api/v1/docs/list","doc":"List your documents, most recently changed first, with an optional search over titles and bodies. Use this to find an id","needs_auth":true},{"method":"Read","path":"/api/v1/docs/read","doc":"Read one of your documents in full, by id or by exact title","needs_auth":true},{"method":"Write","path":"/api/v1/docs/write","doc":"Write a document — a title and a markdown body. Pass an id to replace one you already have. Private unless you set public. For something long enough to re-read; for a short thing to remember, use notes","needs_auth":true}]},{"service":"email","description":"Send a real email to somebody outside this instance","scoped":true,"methods":[{"method":"History","path":"/api/v1/email/history","doc":"The emails this account has sent, newest first, and what became of each one — delivered, undelivered, failed, or still going. Asks the carrier about anything still in flight, so it is current when read","needs_auth":true},{"method":"Send","path":"/api/v1/email/send","doc":"Send a real email to an outside address, from this instance's authenticated sending domain. Takes an address, a subject and a body; resolve a name with contacts_find first. It really is delivered — there is no draft state to undo from. To send as your own address on this instance, so a reply comes back to your inbox, use mail_email; for somebody on this instance use mail_send","cost":"external_email","destructive":true,"needs_auth":true},{"method":"Sender","path":"/api/v1/email/sender","doc":"The address email is sent from, where replies to it go, which addresses this account has proved are its own, and how many messages are left today","needs_auth":true},{"method":"Verify","path":"/api/v1/email/verify","doc":"Check that somebody can read an email address — the verification a signup form runs. Call it with an address to have a six-digit code emailed there, then again with the code the person typed back: the answer says approved or why not, so a wrong code is an answer rather than an error. Pass app to put your product's name in the message rather than this instance's. Costs one send and counts against the daily email allowance. Pass mine when the address is your own and you want mail from it recognised here","needs_auth":true}]},{"service":"events","description":"Calendar: what is scheduled, and when you are free","scoped":true,"methods":[{"method":"Create","path":"/api/v1/events/create","doc":"Schedule a reminder or event at a given time; optionally repeating, and optionally running a prompt through the agent when it fires","needs_auth":true},{"method":"Delete","path":"/api/v1/events/delete","doc":"Cancel an event by id","destructive":true,"needs_auth":true},{"method":"Free","path":"/api/v1/events/free","doc":"Find when the caller has nothing booked — open slots of a given length, within working hours","needs_auth":true},{"method":"List","path":"/api/v1/events/list","doc":"List the caller's upcoming events and reminders, each with its id","needs_auth":true}]},{"service":"files","description":"Per-user file storage: keep a file, get a URL, read it back","scoped":true,"methods":[{"method":"Delete","path":"/api/v1/files/delete","doc":"Delete a file you own","destructive":true,"needs_auth":true},{"method":"Get","path":"/api/v1/files/get","doc":"Read a stored file back by its id","needs_auth":true},{"method":"List","path":"/api/v1/files/list","doc":"List the caller's stored files, newest first","needs_auth":true},{"method":"Put","path":"/api/v1/files/put","doc":"Store a file and get a URL for it — a report, a CSV, a transcript","needs_auth":true},{"method":"Share","path":"/api/v1/files/share","doc":"Make a file readable by anyone with its URL, or private again","needs_auth":true}]},{"service":"flights","description":"Where aircraft are, live from ADS-B","scoped":false,"methods":[{"method":"Airport","path":"/api/v1/flights/airport","doc":"Report what is happening at an airport right now: what is on the ground, what is on approach and what is climbing out. Live positions, not the timetable, so it says nothing about scheduled or delayed departures","needs_auth":false},{"method":"Overhead","path":"/api/v1/flights/overhead","doc":"List the aircraft flying near a location right now, nearest first, with altitude, speed, heading and distance. Live positions broadcast by the aircraft themselves, not a schedule","needs_auth":false},{"method":"Track","path":"/api/v1/flights/track","doc":"Find where an aircraft is right now by flight number ('BA117'), radio callsign ('BAW117') or registration ('G-ZBKL'). Only sees aeroplanes that are airborne and in range of a receiver — not finding one does not mean the flight was cancelled","needs_auth":false}]},{"service":"food","description":"What is in it and whether the kitchen is clean","scoped":false,"methods":[{"method":"Hygiene","path":"/api/v1/food/hygiene","doc":"Food hygiene ratings for UK businesses, from the Food Standards Agency inspections. Takes a business name, a town or postcode, or a lat/lon to look around","needs_auth":false},{"method":"Product","path":"/api/v1/food/product","doc":"Look up a packaged food by its barcode — name, brand, ingredients, allergens, nutrition per 100g, Nutri-Score and how processed it is","needs_auth":false},{"method":"Search","path":"/api/v1/food/search","doc":"Find packaged foods by name or brand, with the barcode of each so one can then be looked up in full","needs_auth":false}]},{"service":"hazards","description":"What is going wrong in the physical world: earthquakes and disaster alerts, live","scoped":false,"methods":[{"method":"Alerts","path":"/api/v1/hazards/alerts","doc":"Current disasters worldwide from GDACS — cyclones, floods, volcanoes, wildfires and earthquakes — with an alert level of green, orange or red. Pass lat/lon to ask about somewhere in particular","needs_auth":false},{"method":"Quakes","path":"/api/v1/hazards/quakes","doc":"Recent earthquakes worldwide from the USGS, with magnitude, place and how long ago. Pass lat/lon to ask about somewhere in particular, min for a magnitude floor, and period for hour, day, week or month","needs_auth":false}]},{"service":"images","description":"Image generation, the daily image and its archive","scoped":true,"methods":[{"method":"Generate","path":"/api/v1/images/generate","doc":"Generate an image from a text prompt and return its URL","cost":"image_generate","needs_auth":true},{"method":"Search","path":"/api/v1/images/search","doc":"Search the public image library by description and get URLs to reuse. Cheaper than generating: look here first","needs_auth":true}]},{"service":"mail","description":"Private messages, and an inbox each of your agents can be reached at","scoped":true,"methods":[{"method":"Inbox","path":"/api/v1/mail/inbox","doc":"List the account's most recent messages — read my mail, check my inbox","needs_auth":true},{"method":"Info","path":"/api/v1/mail/info","doc":"How to reach the caller here: the handle, the email address if this instance has a mail domain, and whether mail from outside can arrive at all. Pass a tag for a separate one (you+tag) — give that out, then read only its messages with mail_inbox(tag)","needs_auth":true},{"method":"Search","path":"/api/v1/mail/search","doc":"Search the account's mail and return matching messages","needs_auth":true},{"method":"Send","path":"/api/v1/mail/send","doc":"Write to somebody, as you. A username reaches them on this instance and is free; a full email address leaves over SMTP under this instance's domain, so a reply comes back to your inbox, and is charged. Resolve a name with contacts_find first. Mail that leaves needs a mail domain configured — without one use email_send, which sends from this instance's own sending domain and expects no reply","destructive":true,"needs_auth":true}]},{"service":"markets","description":"Live crypto, stock, futures, commodity and currency prices, and conversion between them","scoped":false,"methods":[{"method":"Convert","path":"/api/v1/markets/convert","doc":"Convert an amount from one currency to another — 250 GBP in JPY. Uses European Central Bank reference rates, and takes a past date back to 1999. Crypto converts at the live price through the dollar","needs_auth":false},{"method":"List","path":"/api/v1/markets/list","doc":"Get live prices for cryptocurrencies, stocks, commodities (oil, gold, silver, copper and crops), futures and currencies","needs_auth":false}]},{"service":"news","description":"Headlines aggregated from RSS feeds, with search and full articles","scoped":false,"methods":[{"method":"List","path":"/api/v1/news/list","doc":"Read recent news headlines with short summaries, balanced across topics","needs_auth":false},{"method":"Read","path":"/api/v1/news/read","doc":"Read one news article in full by its id or URL","needs_auth":false},{"method":"Search","path":"/api/v1/news/search","doc":"Search indexed and live news for a topic","cost":"news_search","needs_auth":false}]},{"service":"notes","description":"What you wrote down, and what an agent wrote down for you","scoped":true,"methods":[{"method":"Add","path":"/api/v1/notes/add","doc":"Write a note under a title, so it is there next conversation. Writing a title that exists rewrites that note","needs_auth":true},{"method":"Delete","path":"/api/v1/notes/delete","doc":"Delete one note by title","destructive":true,"needs_auth":true},{"method":"Get","path":"/api/v1/notes/get","doc":"Read one note by title. Use it when you know the title; notes_list when you do not","needs_auth":true},{"method":"List","path":"/api/v1/notes/list","doc":"List every note the caller has written, with its text","needs_auth":true}]},{"service":"places","description":"Places, points of interest and geocoding","scoped":false,"methods":[{"method":"Address","path":"/api/v1/places/address","doc":"Name the place at a latitude and longitude — the reverse of places_geocode. Use it whenever you have coordinates and need to say where that is","needs_auth":false},{"method":"Elevation","path":"/api/v1/places/elevation","doc":"How high a place is above sea level, in metres and feet. Sampled from a 90-metre global elevation model, so a summit reads a little under its surveyed height","needs_auth":false},{"method":"Geocode","path":"/api/v1/places/geocode","doc":"Resolve a place name or address to coordinates","needs_auth":false},{"method":"Nearby","path":"/api/v1/places/nearby","doc":"List points of interest near a location","cost":"places_nearby","needs_auth":false},{"method":"Search","path":"/api/v1/places/search","doc":"Find places by name or category, optionally near a location","cost":"places_search","needs_auth":false}]},{"service":"prayer","description":"Islamic prayer times, qibla and a daily reflection","scoped":false,"methods":[{"method":"Qibla","path":"/api/v1/prayer/qibla","doc":"Get the qibla — the compass bearing to face for Islamic prayer from a location","needs_auth":false},{"method":"Reflection","path":"/api/v1/prayer/reflection","doc":"Get today's Islamic reflection — a verse of the Quran with its surah, a saying of the Prophet, and a name of Allah","needs_auth":false},{"method":"Saying","path":"/api/v1/prayer/saying","doc":"Look up a hadith from Sahih al-Bukhari, optionally from a given book","needs_auth":false},{"method":"Search","path":"/api/v1/prayer/search","doc":"Search the Quran, the hadith and the names of Allah by meaning — ask a question in plain language rather than naming a reference","cost":"quran_search","needs_auth":false},{"method":"Times","path":"/api/v1/prayer/times","doc":"Get today's Islamic prayer times (salah) for a location, and which prayer is next","needs_auth":false},{"method":"Verse","path":"/api/v1/prayer/verse","doc":"Look up a chapter of the Quran, or one verse within it, by number. Use prayer_search to ask a question instead of naming a reference","needs_auth":false}]},{"service":"routes","description":"How to get from one place to another — time, traffic and turn-by-turn","scoped":false,"methods":[{"method":"Directions","path":"/api/v1/routes/directions","doc":"The turn-by-turn route between two places, with the distance for each instruction. Use ETA instead when only the travel time is wanted — this asks the provider for more and costs more","cost":"routes_directions","needs_auth":false},{"method":"ETA","path":"/api/v1/routes/eta","doc":"How long it takes to travel between two places, by road rather than as the crow flies. Can be asked about a future departure, or told when you need to arrive and answer when to leave","cost":"places_eta","needs_auth":false},{"method":"Nearest","path":"/api/v1/routes/nearest","doc":"Given a starting point and several destinations, say which is quickest to reach and put them in order. Each destination is a separate routing lookup, so ask about the places you are actually choosing between rather than a long list","cost":"places_eta","needs_auth":false}]},{"service":"sms","description":"Text somebody, and read what they text back","scoped":true,"methods":[{"method":"History","path":"/api/v1/sms/history","doc":"Read the texts this account has sent and received, newest first. Both directions, which is why it is not called an inbox","needs_auth":true},{"method":"Number","path":"/api/v1/sms/number","doc":"The number texts are sent from, which numbers are verified as yours, and how many messages are left today","needs_auth":true},{"method":"Send","path":"/api/v1/sms/send","doc":"Text somebody, from this instance's number. Charged per 160-character segment, capped per day, and the recipient can stop it with STOP","destructive":true,"needs_auth":true},{"method":"Verify","path":"/api/v1/sms/verify","doc":"Claim a number as your own, so texts arriving from it reach this account. Call it with just the number to have a code texted there, then again with the code","needs_auth":true}]},{"service":"social","description":"Public threads, replies and status","scoped":false,"methods":[{"method":"List","path":"/api/v1/social/list","doc":"Read the latest social posts from the network","needs_auth":false},{"method":"Search","path":"/api/v1/social/search","doc":"Search public posts on this instance by keyword. This is the instance's own feed, not the wider internet — use web_search for that","cost":"social_search","needs_auth":false}]},{"service":"stream","description":"The console: this instance's own event timeline","scoped":false,"methods":[{"method":"List","path":"/api/v1/stream/list","doc":"Read recent events from the console timeline","needs_auth":false},{"method":"Post","path":"/api/v1/stream/post","doc":"Post an entry to the console timeline","cost":"stream_post","needs_auth":false}]},{"service":"tasks","description":"What is to be done: a list you keep, and work you can hand to the agent","scoped":true,"methods":[{"method":"Create","path":"/api/v1/tasks/create","doc":"Add a task. Assign it to the agent and it can pick the task up itself","needs_auth":true},{"method":"Delete","path":"/api/v1/tasks/delete","doc":"Remove a task","destructive":true,"needs_auth":true},{"method":"List","path":"/api/v1/tasks/list","doc":"List the caller's tasks, open ones first; optionally filtered by state","needs_auth":true},{"method":"Next","path":"/api/v1/tasks/next","doc":"The next task assigned to the agent — what to work on now","needs_auth":true},{"method":"Update","path":"/api/v1/tasks/update","doc":"Change a task: its state, or the result of doing it","needs_auth":true}]},{"service":"text","description":"Language work: summarise, extract structure, classify, translate","scoped":false,"methods":[{"method":"Classify","path":"/api/v1/text/classify","doc":"Sort text into one of the labels you give, with a confidence. For routing, triage and moderation. Capped at 30,000 characters","cost":"text_classify","needs_auth":false},{"method":"Extract","path":"/api/v1/text/extract","doc":"Turn text into JSON matching a schema you give. Pass the fields you want as a JSON schema or a plain description; returns JSON only. Capped at 30,000 characters","cost":"text_extract","needs_auth":false},{"method":"Summarise","path":"/api/v1/text/summarise","doc":"Summarise text into a few sentences. Pass style=bullets for a list, or a sentence count. Capped at 30,000 characters","cost":"text_summarise","needs_auth":false},{"method":"Translate","path":"/api/v1/text/translate","doc":"Translate text into another language, preserving formatting. Capped at 30,000 characters","cost":"text_translate","needs_auth":false}]},{"service":"transit","description":"Public transport: stops near you, what is due, and which lines are down","scoped":false,"methods":[{"method":"Arrivals","path":"/api/v1/transit/arrivals","doc":"What is due at a stop and when. Takes a stop name or an id. In London this is live from TfL — buses, tube, DLR, Overground and Elizabeth line. Elsewhere it is the published timetable, and says so","needs_auth":false},{"method":"Feeds","path":"/api/v1/transit/feeds","doc":"Which published timetables this instance carries, and which others it could — with the size of each, so an operator can see what switching one on costs. Also names the feeds that look right but whose timetables have run out","needs_auth":false},{"method":"Nearby","path":"/api/v1/transit/nearby","doc":"Bus stops and stations near a point, nearest first, with the id each one is called by. London live from TfL; elsewhere from whichever published timetables this instance has loaded","needs_auth":false},{"method":"Status","path":"/api/v1/transit/status","doc":"Which lines are delayed, part-suspended or closed right now, and why. London only","needs_auth":false}]},{"service":"user","description":"What you keep, hide and block — your own view of everybody else's content","scoped":true,"methods":[{"method":"Block","path":"/api/v1/user/block","doc":"Block another account, hiding all of their content from the caller's view","destructive":true,"needs_auth":true},{"method":"Flag","path":"/api/v1/user/flag","doc":"Report a post, comment or message for a human moderator to look at. Does not remove anything itself — use user_hide to hide something from your own view","needs_auth":true},{"method":"Hide","path":"/api/v1/user/hide","doc":"Hide an item so the caller stops seeing it. Affects only this account's view; use user_flag to report something to a moderator instead","needs_auth":true},{"method":"Save","path":"/api/v1/user/save","doc":"Save an item to the caller's bookmarks so it can be found again. Private to the caller, and reversible with user_unsave","needs_auth":true},{"method":"Saved","path":"/api/v1/user/saved","doc":"List the items the caller has saved for later, with their links","needs_auth":true},{"method":"Unblock","path":"/api/v1/user/unblock","doc":"Stop blocking another account, so their posts and messages reach the caller again. Reverses user_block","needs_auth":true},{"method":"Unsave","path":"/api/v1/user/unsave","doc":"Remove an item from the caller's bookmarks. Leaves the item itself untouched — this only forgets that it was saved","destructive":true,"needs_auth":true}]},{"service":"video","description":"Video from curated channels, without ads or recommendations","scoped":false,"methods":[{"method":"List","path":"/api/v1/video/list","doc":"Read the latest videos from curated channels","needs_auth":false},{"method":"Search","path":"/api/v1/video/search","doc":"Search videos from the channels this instance curates. A curated set rather than all of YouTube, so a miss means it is not followed here, not that it does not exist","cost":"video_search","needs_auth":false}]},{"service":"wallet","description":"A key of your own on Base: an address to hold USDC, what it holds, and paying for a tool on another server with it","scoped":true,"methods":[{"method":"Address","path":"/api/v1/wallet/address","doc":"Your own address on Base, to receive USDC. Created the first time you ask. Funds sent on any other chain land at the same address there and cannot be reached from here","needs_auth":true},{"method":"Balance","path":"/api/v1/wallet/balance","doc":"What your wallet holds in USDC on Base. Says so plainly when the chain could not be reached, because that is not the same as holding nothing","needs_auth":true},{"method":"List","path":"/api/v1/wallet/list","doc":"Which priced servers this wallet is allowed to pay, by name. Pass one of these names to wallet_pay","needs_auth":true},{"method":"Pay","path":"/api/v1/wallet/pay","doc":"Call a tool on one of those servers and pay for it from your wallet if it asks. Nothing is spent when the tool is free. Every payment is capped per call and per day, so a server cannot name any price it likes","needs_auth":true}]},{"service":"weather","description":"Forecast, air quality, sea state and what the weather actually was","scoped":false,"methods":[{"method":"Air","path":"/api/v1/weather/air","doc":"Air quality at a location right now — AQI, PM2.5, PM10, ozone, nitrogen dioxide, UV index, and pollen where it is counted","needs_auth":false},{"method":"Forecast","path":"/api/v1/weather/forecast","doc":"Get the weather forecast for a location — current conditions and the days ahead","cost":"weather_forecast","needs_auth":false},{"method":"History","path":"/api/v1/weather/history","doc":"What the weather actually was at a location between two dates — average high and low, total rainfall and the extremes. Records run a few days behind today","needs_auth":false},{"method":"Marine","path":"/api/v1/weather/marine","doc":"Sea state at a coastal or offshore point — wave height, period and direction now and for the days ahead, with sea temperature","needs_auth":false}]},{"service":"web","description":"The open web: search it, read a page from it","scoped":false,"methods":[{"method":"Fetch","path":"/api/v1/web/fetch","doc":"Fetch a web page by URL and return its cleaned readable content, stripping ads, popups and navigation. Needs an account","cost":"web_fetch","needs_auth":false},{"method":"Search","path":"/api/v1/web/search","doc":"Search the web for current information and news","cost":"web_search","needs_auth":false}]},{"service":"whatsapp","description":"Reply to people on WhatsApp, and read what they send","scoped":true,"methods":[{"method":"History","path":"/api/v1/whatsapp/history","doc":"Read the WhatsApp messages this account has sent and received, newest first","needs_auth":true},{"method":"Open","path":"/api/v1/whatsapp/open","doc":"List who can be written to on WhatsApp right now and until when. Check this before promising to follow up later","needs_auth":true},{"method":"Send","path":"/api/v1/whatsapp/send","doc":"Send a WhatsApp message. Only to somebody who has written to this instance in the last 24 hours — WhatsApp's own rule, not this one, and there is no way around it without templates approved in advance","destructive":true,"needs_auth":true}]}]}
