On July 9, 2026, OpenAI launched the new ChatGPT app catalog. On July 21 — just 12 days later — "Când Reciclăm?" (When Do We Recycle?) became my first application evaluated, approved and published in it. This is the first case study in a series about the four applications I built for the OpenAI ecosystem. I'm starting with this one because it's the easiest to understand: a city problem, official data that's hard to use, and an assistant that answers a question every Bucharest resident asks — "when is the garbage collected on my street?"
At a glance
- 5 public MCP tools — street search, collection schedule, per-district transparency, sorting guide, data freshness
- ~29,000 raw records from operators, automatically normalized into recurrence rules
- Over 30 official domains cited as sources in the content
- 3 forms, one data source: website, installable PWA, app in ChatGPT
- Evaluated, approved and published by OpenAI on July 21, 2026 — 12 days after the app catalog launched (July 9); free, no account, open source
The problem
In Bucharest, only 2 of 6 districts publish per-address waste-collection schedules. Where the information exists, it's buried in the sanitation operators' websites: hard-to-navigate pages, documents split by street segments, different formats from one district to another. And separate collection means different days for different waste types — household, recyclables, bio, glass, bulky items. In practice, a resident who wants to recycle correctly has to do detective work.
Why existing solutions weren't enough
The information existed, but not in a usable form. Operator websites are designed as publications, not services: you find a schedule if you already know where to look and have the patience to go through the documents. There is no single place where you type your address and get the answer. And for the districts that publish nothing per address, even detective work doesn't help — and nobody honestly tells you the data is missing and where you can call instead.
Objectives
I started with four clear objectives:
- Per-address answers: type your street and number, get the exact collection days per waste type.
- Official sources only: every claim citing its source — nothing invented, nothing "from hearsay".
- Honesty where data is missing: for districts that don't publish, the app explicitly says what each operator publishes, what it doesn't, and how you can actually find out (dispatch numbers, collection points).
- Frictionless distribution: free, no account, no ads — on the web, as an installable PWA and, since July, directly in ChatGPT.
The architecture
The application has three layers, all built on the same data source:
- Data collection: the official operators' schedules (Romprest for Sector 1, Supercom for Sector 2) are ingested automatically and normalized — nearly 29,000 raw records turned into recurrence rules per street segment. Over 30 official domains are cited as sources in the content.
- The web app (PWA): per-address search, schedules by waste type, push notifications before collection day, and a sorting guide for the hard cases (batteries, used cooking oil, medicines, e-waste, textiles, deposit-return SGR).
- The MCP server: exposes the same data to AI agents through five public tools — street search, collection schedule, per-district transparency status, sorting guide and data freshness.
The important detail: the MCP server has no database of its own. It uses exactly the same API as the web app. One source of truth, whether you ask the website or ChatGPT.
Why MCP and not a classic chatbot?
A classic chatbot would have meant building and maintaining yet another conversational interface, convincing users to come to it, and paying for model infrastructure. MCP (Model Context Protocol) inverts the logic: the application goes where users already are. ChatGPT brings the conversation and natural-language understanding; my application brings verifiable data, through tools the model calls when it needs them.
The essential difference is trust: a model asked directly "when is the garbage collected on street X" will answer plausibly — but it will make it up. With MCP, the model doesn't guess — it calls the tool, and the tool answers from official data, with the source attached. And if data is missing for your district, the answer says exactly that instead of improvising.
The complete flow
User
│ "When is the garbage collected at Strada Aviatorilor 20?"
▼
ChatGPT
│ picks the right tool and extracts the address
▼
MCP server — 5 public tools
│ recycling_search_street → recycling_collection_schedule
▼
The app's API
│ same data as the website
▼
Database
│ recurrence rules per street segment
▲
│ automatic refresh
Official sources
(sanitation operators; 30+ cited domains)
The user types a normal question. ChatGPT identifies the intent, first calls the street search (which tolerates diacritics and name variations), then requests the schedule for the matched segment. The answer comes back with days per waste type and the official source — and the model phrases it conversationally. The whole flow takes a few seconds.

The challenges
- Source data: different formats, pages designed for reading, not for processing. The solution: automatic ingestion plus normalization into a single model of recurrence rules.
- Transparency gaps: 4 of 6 districts publish no per-address schedules. The hard decision was not to mask this — I turned missing data into a feature: a dedicated tool reports the transparency status of each district.
- Address matching: people type "Aviatorilor", "str. aviatorilor", with or without diacritics. Search had to be tolerant, otherwise the flow broke at the very first step.
- Trust in answers: models can hallucinate. The antidote: a cited source on every row and a freshness tool so the agent can say how recent the data is.
- The OpenAI review: the process requires legal pages, a privacy policy, domain verification and an app that does what it declares. Rigorous preparation paid off: the catalog launched on July 9, and by July 21 the app was already evaluated, approved and published in it.
The key technical decisions
- One source of truth — the MCP consumes the app's API, not a copy of the data.
- Recurrence rules, not static calendars — schedules are expressed as rules per street segment, so they stay valid without manual regeneration.
- Read-only tools, no account — nothing to install, nothing to configure, zero personal data requested.
- Honesty as architecture — "we don't know" is a first-class answer, with practical guidance, not an error.
- Open standard — MCP is not ChatGPT-specific; the same integration can work with any compatible client.
- Open source — the code is public on GitHub (marian5070/cand-reciclam), available for audit and for adaptation to other cities.
The result
The application lives today in three forms, all from the same data: cand-reciclam.madeinro.eu, an installable PWA with push notifications, and an app in ChatGPT — evaluated, approved and published by OpenAI in the app catalog on July 21, 2026, 12 days after the catalog launched (July 9). Free, no account, no ads. Launched in April 2026, with the state of the data documented transparently, district by district.
Try the app in ChatGPT or see the project page.
What would I improve in the next version?
- Coverage: extending to districts 3–6 as operators publish usable data — the architecture is ready, only the sources are missing.
- Other cities: the model (automatic ingestion + recurrence rules + honesty about gaps) is replicable anywhere; the open code is an explicit invitation.
- Richer answers in ChatGPT: visual cards with the week's calendar, not just text.
- The feedback loop: users see the reality on the ground before any official website does — their reports can correct and enrich the data.
---
This case study is part of a series on building AI applications for the OpenAI ecosystem. Coming up: RoTV Guide, Digital Compass and Travel Trends — each with a different architecture lesson. The context for the whole story: AI adoption is a delivery discipline.