# Presso Network > Presso Network Ltd is a small UK studio that builds MCP apps: tools an AI assistant such as Claude or ChatGPT can use to do real work. This site is the directory of everything the studio has built. Each app has its own page saying what it does, what it does not do, and how to add it. > Every app page, note, log entry, portfolio entry and policy is also served as plain Markdown at the same URL with `.md` appended, for example https://www.pressonetwork.com/apps/corey.md. The whole directory as data: https://www.pressonetwork.com/apps.json. Full text of the writing: https://www.pressonetwork.com/llms-full.txt ## Apps - [Corey](https://www.pressonetwork.com/apps/corey): Live. Gives your AI a playbook for starting and running a small business. - [Presso Events](https://www.pressonetwork.com/apps/presso-events): Live. Run ticketing and the event app for your conference from your AI. - [Cookbook](https://www.pressonetwork.com/apps/cookbook): In progress. A personal cookbook your AI keeps for you. Corey also carries 59 skills and 50 knowledge packs, listed on the homepage and in https://www.pressonetwork.com/apps.json. ## Pages - [Home](https://www.pressonetwork.com/) - [Apps](https://www.pressonetwork.com/apps) - [What is an MCP app?](https://www.pressonetwork.com/what-is-an-mcp-app) - [How we work](https://www.pressonetwork.com/how-we-work) - [Notes](https://www.pressonetwork.com/notes) - [Log](https://www.pressonetwork.com/log) - [About](https://www.pressonetwork.com/about) - [Portfolio](https://www.pressonetwork.com/portfolio) - [All links (social hub)](https://www.pressonetwork.com/links) ## Notes - [Semi-headless: designing a product whose first user is an agent](https://www.pressonetwork.com/notes/semi-headless): A headless SaaS CMS is hosted content with an API and no front end of its own. Semi-headless goes one step further: the API is built for an agent to operate, and the screens shrink to the few moments a human genuinely has to look. Here is the pattern, and the nightly mess that taught us why meaning has to live in the data. - [MCP OAuth 2.1: your server is the bouncer, not the ticket office](https://www.pressonetwork.com/notes/mcp-oauth-2-1): Under MCP OAuth 2.1 your remote server checks tokens and never issues them. The part tutorials skip is refusal: the audience check, and guarding every route. - [Most first MCP servers are complete, correct, and unusable](https://www.pressonetwork.com/notes/my-first-mcp-server-was-complete-correct-and-unusable): An MCP server exposes your system to someone else's AI, not to a developer. Mapping one tool per API endpoint feels thorough and makes the model do five hops to answer one question. Here is how to spot the pattern and design task-shaped tools instead. - [Building an MCP server from scratch, and the recurring third bug](https://www.pressonetwork.com/notes/how-to-build-an-mcp-server-from-scratch-and-why-the-third-bug-is): Building an MCP server from scratch means picking tools over endpoints, wiring auth before the first tool call, and shipping to a real host before you trust it. Here is what that actually looks like, including the three defects we found in our own admin server within hours of merging it. - [The Job That Paged a Human to Say It Had Nothing to Say](https://www.pressonetwork.com/notes/job-that-paged-a-human-to-say-it-had-nothing-to-say): A cron job that forgot to write its own outcome file paged a human to announce it had nothing to report. That forced a rule: only what a human can act on reaches Slack, and exactly one line of code is allowed to decide. - [Every fault got its own ticket. That was the fault.](https://www.pressonetwork.com/notes/every-fault-got-its-own-ticket-that-was-the-fault): A machine-detected fault used to become a GitHub issue the moment it happened, which scattered one recurring problem across dozens of tickets and made it impossible to tell what was actually recurring. Now a fault has to happen on three separate days before it earns one. - [Your About Page Describes A Company You Have Already Left](https://www.pressonetwork.com/notes/your-about-page-describes-a-company-you-have-already-left): The public pages nobody touches keep describing the company you were when you last wrote them. Here is the ten-minute check that finds the gap, and what we found when we ran it on ourselves. - [A connector directory is not a marketplace. The difference is the toll](https://www.pressonetwork.com/notes/the-connector-directory-is-not-a-marketplace-yet): A directory lists you. A marketplace takes a cut, ranks you, and eventually decides how you charge. MCP connector directories currently do the first and not the rest, and that gap is worth building into rather than waiting out. - [What a database driver with no transactions actually costs](https://www.pressonetwork.com/notes/what-a-database-driver-with-no-transactions-costs): A suite of 1,257 passing tests shipped a bug that returned 500 on every call, because the tests and production ran on different database drivers. ## Log - [A gate caught my own arithmetic, twice in one day](https://www.pressonetwork.com/log/2026-08-19-a-derived-gate-caught-my-own-arithmetic): broke - Two hand-typed counts in a migration plan were both wrong. A gate that derived its expectation from the source caught both, twice in one day. - [A gate result is only as good as the install it ran on](https://www.pressonetwork.com/log/2026-08-19-a-gate-result-trusts-its-own-install): learned - A visual gate reported twelve findings on a known-good branch. The dependency install was broken, not the code, and the obvious control proved nothing. - [The events corpus moved to presso.events](https://www.pressonetwork.com/log/2026-08-19-events-content-moves-to-presso-events): shipped - 98 items moved off this domain behind 103 redirects, verified against production. On Cloudflare Pages a static asset silently beats a redirect rule. - [The redirect chain you create by fixing something else](https://www.pressonetwork.com/log/2026-08-19-redirect-chains-you-create-by-fixing-something-else): learned - Adding one redirect quietly turned an existing one into a two-hop chain. A gate that resolves every rule transitively flattened 55 of them. - [Most of the work was already done, and the plan did not know](https://www.pressonetwork.com/log/2026-08-19-the-events-site-was-already-built): learned - The plan scheduled building a marketing site that a single curl showed was already live. That correction removed most of the migration. - [The exit code that belonged to the pipe](https://www.pressonetwork.com/log/2026-08-19-the-piped-exit-code): broke - The verify command piped into tail printed exit=0 while the gate had failed. In a pipeline you get the last command's exit code, not the one that matters. - [The compiler that silently skipped thirteen files](https://www.pressonetwork.com/log/2026-08-18-a-context-compiler-that-skipped-thirteen-files): broke - A context compiler dropped thirteen source files without warning, until a downstream tool confidently quoted a price for something that does not exist. - [An exclusion list that had never matched a single file](https://www.pressonetwork.com/log/2026-08-18-a-filter-that-had-never-matched-anything): broke - A sitemap exclusion list had never excluded anything. One trailing slash made every comparison return false, silently, for months. - [A price we deleted, still being published](https://www.pressonetwork.com/log/2026-08-18-a-price-that-survived-being-deleted): broke - We deleted a price from the page and left it live in llms-full.txt, in JSON-LD offers, and in ten blog posts. None of that renders in a browser. - [Three confident diagnoses, all wrong, one actual cause](https://www.pressonetwork.com/log/2026-08-18-three-wrong-diagnoses-one-cause): learned - Three confident diagnoses, all wrong in the same way: the instrument was pointed at the wrong thing. Check what you measure before you read it.