The question people ask twice

Somebody takes a medicine that is in shortage. They already know it is short. What they want, next week and the week after, is whether anything moved. That is not a lookup, it is a watch, and it is the one shape a voice assistant is genuinely better at than a screen, because the answer is usually one sentence and often three words.

Why this is not already solved

The answer exists and it is public. The FDA shortage register held 1 176 current records, 451 ending and 7 resolved on the day I read it, and each record is a package rather than a medicine. It updates daily, it is free, and no language model can know it, because it changed this week.

The trouble is the shape. The register keys a shortage on the package, not on the medicine. Clonazepam alone comes back as forty separate records from six suppliers under one dosage form. Reading forty records out loud is not an answer, and a model asked to summarise them will invent the part that matters.

What stillshort does

Three tools, because a short spoken exchange works best with few verbs.

watch follows a substance and answers where it stands now. One reading per status, how many packages, how many suppliers, and the most useful note the register actually carries. watching reads the list back, and forgets one or all of it in a word. changed is the point of the whole thing, what moved since each one was last read, and a flat nothing has changed when nothing did.

What it refuses to do

It does not tell you what to take instead, it does not say whether to worry, and it does not turn a status into advice. Every answer that carries a shortage carries the agency's own sentence back with it, verbatim, that its data are unvalidated and must not be used to make decisions about medical care.

When the register cannot be reached, it says so and adds nothing to the list. A silent server is worse than one that admits it could not look, because the caller reads silence as good news. That is the one failure mode this product cannot have.

Where the data live

The watchlist is plain JSON on the user's own machine. The list itself never leaves it, each check sends only the substance name to the FDA's public API, nothing is encrypted, and one call empties the list. An encrypted file the owner cannot read is worse than a readable one they can delete.

How it was built

An MCP server on the 2025-11-25 protocol, standard library only apart from the SDK. Seventeen tests, none of which touch the network, running against real register answers frozen on the day of the build, so the shapes under test are the shapes the service really sends rather than the shapes I would have invented. A demonstration script drives the server over the real protocol on an in-memory stream pair, so what you see is what a client gets and no port is opened.

The video

It plays a real spoken exchange on a simulated Alexa+ display, the alternate path the Alexa+ track allows. A synthetic voice plays the person, Whisper transcribes it, a language model client that can reach nothing but the three stillshort tools decides what to call over MCP on stdio, and a second voice reads the answer. The display is sim/device.html and the script that plays the take on it is sim/film.py, both in the repository with talk.py and the take transcript. The caption, the reply, the result card and the tool calls on screen are read from the take, and only the model's thinking time is cut. One take cannot show the register moving, so its last answer is Nothing has changed.

Two defects the data handed me

Both were found by looking at the records rather than by reading the docs, both are fixed, and both carry a test.

The register writes dates MM/DD/YYYY. Comparing those as text picks the wrong most recent entry whenever two records come from different years, so a test written from a single year of data stays green.

related_info is one free text field carrying two unrelated things. Estimated supply, August 2026 answers the question. Marketed by Advagen Pharma Ltd. does not, and read aloud it sounds like an answer, which is an incorrect impression built entirely out of correct data. A supply note now wins whenever there is one.

Built With

Share this project:

Updates

Submission history