<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Sara Pereira — Writing</title><description>Notes on multi-tenant architecture, MCP agents in production and proving refactors safe.</description><link>https://saracgpereira.com/</link><language>en</language><item><title>Four MCP servers became one, and the reason was a bug that shipped three times</title><link>https://saracgpereira.com/writing/four-mcp-servers-into-one/</link><guid isPermaLink="true">https://saracgpereira.com/writing/four-mcp-servers-into-one/</guid><description>We had one MCP server per product. They were copies of the same scaffold, so a single bad SQL guard shipped as three separate bugs. Here is what we replaced them with, and how we proved it before switching anything off.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><category>MCP</category><category>multi-tenant</category><category>architecture</category></item><item><title>One validated query, three doors: adding a CLI without adding a bypass</title><link>https://saracgpereira.com/writing/one-query-three-doors/</link><guid isPermaLink="true">https://saracgpereira.com/writing/one-query-three-doors/</guid><description>tenant-scoped-rag grew a second MCP transport and a clipboard-delivery CLI for local LLMs that speak neither stdio nor HTTP. The design question was not &quot;does it work&quot; but &quot;does walking through the new door skip the check the old ones enforce.&quot;</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><category>MCP</category><category>RAG</category><category>CLI</category><category>architecture</category></item><item><title>A cell that starts with &quot;=&quot; is not data: sanitizing exports against formula injection</title><link>https://saracgpereira.com/writing/formula-injection-export-sanitization/</link><guid isPermaLink="true">https://saracgpereira.com/writing/formula-injection-export-sanitization/</guid><description>A CSV/Excel export endpoint treated every cell as text, but a spreadsheet application does not. Four leading characters turn a cell into a formula, one shared export base class fixes it for every report at once, and the test that matters checks the byte at index zero, not the string.</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><category>security</category><category>sanitization</category><category>CSV</category><category>testing</category></item><item><title>The database refuses: proving tenant isolation instead of asserting it</title><link>https://saracgpereira.com/writing/tenant-scoped-rag/</link><guid isPermaLink="true">https://saracgpereira.com/writing/tenant-scoped-rag/</guid><description>A RAG server where the RLS policy carries the isolation, not the application query. 180 cross-tenant queries, zero leakage, and a canary test that deliberately breaks isolation to prove the suite would catch it if it ever happened for real.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><category>PostgreSQL</category><category>RLS</category><category>multi-tenant</category><category>RAG</category><category>MCP</category></item></channel></rss>