Building a Read-Only MCP Server & Frozen Signal Contract | Mycroft

Om Mali shows how the Mycroft Private Eye valuation data was made usable by other systems: a read-only MCP server with six tools that write nothing, and a signal file frozen at version 1.0. Testing revealed assumptions hidden inside the test itself.

3:32 video3 min readWatch on YouTube

In week 10 of the Mycroft Private Eye valuation agent build, Om Mali turns a dataset that only one person could use into something other systems can use. Until now, everything was a script to run and a document to read. The video describes two deliverables: a read-only server an AI assistant can query directly, and a frozen signal contract that another system can parse without guessing.

Two deliverables, and where the difficulty was

The server has six tools, none of which writes anything. The signal file is frozen at version 1.0. Om notes that the protocol itself was never the hard part, since writing a server that speaks it took an afternoon. The hard parts were size, and what a contract has to refuse.

Bounding the results

Asking for one company's full price history returns 2,151 rows, about 575,000 characters, or roughly 143,000 tokens. That is larger than most context windows, and useless even where it fits, because a model handed 2,000 rows will not read them. So every answer has three parts: a summary describing the whole result set, one bounded page, and a cursor. On that query the answer shrinks to 18,000 characters instead of 575,000.

Bounding is not free. The same envelope makes the other five tools' answers bigger by 19 to 49 percent.

Six tools, none that write

The six tools list the companies, get one company's marks, compare managers on a date, get propagation, get a fund's exposure, and list what is still unresolved. No tool records a decision, clears a gate, or changes a mark. Om had established earlier that a resolution decision needs a named human, and a tool a model can call is the opposite of that.

The frozen signal

The signal has nine top-level keys, frozen at version 1.0 and validated before it is ever written to disk. It refuses 10 field names outright, including valuation, market cap, and shares outstanding. The filings give a fund's share count but never a company's total shares. Where a figure is withheld, the reason is a value rather than a missing key. Four companies are suppressed this quarter, and two counts disagree on purpose: the server lists 11 companies, while the signal publishes 10, because the 11th has zero marks. An empty answer is still an answer, and the server says so.

Checking the quarterly note

The quarterly note is the only prose a model writes here. It gets the computed figures and nothing else, with no database and no tools. Om expected one check, no number that is not in the figures, to be enough. It was not. A draft passed cleanly and still claimed one company had the fewest marks, when another had fewer. Two gaps remain: an empty draft slipped past every check and was recorded as a success at zero words, and a draft that spelled a number in words went unread because the check only looked at digits.

Hidden assumptions in tests

Three setup bugs in a row were invisible from inside the server, because Om's own test supplied things a real client does not.

Key takeaways

  • A read-only MCP server with six tools makes the valuation data queryable without giving a model write access.
  • No tool records a decision, clears a gate, or changes a mark.
  • Every answer is a summary, one bounded page, and a cursor, cutting one result from 575,000 to 18,000 characters.
  • The envelope costs the other five tools 19 to 49 percent more.
  • The signal contract has nine keys, is frozen at 1.0, and refuses 10 field names.
  • A single grounding check passed a draft that invented a ranking, so there are now four checks.
  • A test can hide what a real client would lack.

Try it yourself

Om's prompt for Claude: take a test you trust and find what it supplies that a real caller would not, such as the working directory, an environment variable, or an already running process. Withhold one and run it again. For Om, the test passed three times before a real client ever reached the server.

Chapters

  1. 0:00Introduction: Making Valuation Datasets AI-Usable
  2. 0:30The 2 Deliverables: Read-Only MCP Server & Frozen Signal Contract
  3. 1:05Taming Context Windows: Bounding 575k Chars to 18k
  4. 1:40Safety First: Why Zero Tools Are Allowed to Write Decisions - Grounding Checks & Catching Ranking Hallucinations
  5. 3:00Environmental Testing: Finding Hidden Client Assumptions
Full transcript(auto-generated, with timestamps)

Introduction: Making Valuation Datasets AI-Usable

[0:00]Hi, I'm Molly. This video is about making this data set usable by something other than me. Two pieces, a readonly server and I assistant can query directly and a frozen JS contract another system can parse without guessing. Up to now, everything here was a script I run and a document I read. Fine for building it, useless to anyone else. Two deliverables, a server with six tools, none of which writes anything, and a signal file frozen at version 1.0. The hard part was never the protocol. Writing a server that speaks it took an afternoon. The hard parts

The 2 Deliverables: Read-Only MCP Server & Frozen Signal Contract

[0:31]Were size and what a contract has to refuse. Ask for data bricks full price history and you get 2,151 rows, 575,000 characters, roughly 143,000 tokens. That is larger than most context windows and useless even where it fits because a model handed 2,000 rows will not read them. So every answer is three parts. A summary describing the whole result set, one bounded page, and a cursor. on that query. 18,000 characters instead of 575,000. But look at the other five tools. The envelope makes every one of them bigger

Taming Context Windows: Bounding 575k Chars to 18k

[1:05]By 19 to 49%. Bounding is not free. Six tools list the companies, get one company's marks, compare managers on a date, get propagation, get a funds exposure, and list what is still unresolved. Nothing writes. No tool records a decision, clears a gate, or changes a mark. Earlier, I established that a resolution decision needs a named human. A tool a model can call is the opposite of that. The other piece is the signal. Nine top level keys frozen at version 1.0 and validated before it is ever written to disk. It refuses 10 field names outright. Valuation, market cap, shares outstanding, return not

Safety First: Why Zero Tools Are Allowed to Write Decisions - Grounding Checks & Catching Ranking Hallucinations

[1:40]Style structure. These filings give a funds share count, never the company's total shares. Where a figure is withheld, the reason is a value, not a missing key. Four companies are suppressed this quarter, and two counts here disagree on purpose. The server lists 11 companies. The signal publishes 10. The 11th has zero marks. An empty answer is still an answer and the server says so rather than returning nothing. The quarterly note is the only proza model writes here and it gets the computed figures and nothing else. No database, no tools. I expected one check to be enough. No number that is not in the figures. It was not. A draft passed cleanly and still said one company had the fewest marks. One sentence before saying a different company had

The fewest. Two things the checks still miss. A draft that came back empty past every one of them and was recorded as a success at zero words. And a draft that spelled a number in words when unread because the check only looked at digits. Then three setup bugs in a row, all invisible from inside the server. All because my test supplied what a real client does not. Week 10 on one page. A readonly server with six tools, none of which writes a mark, a gate, or a decision. One query returns 2,151 rows bounded to 18,000 characters from 575,000 and the envelope costs more on the other five tools than it saves there. A signal frozen at 1.0 with nine keys and 10 field names refused by name. And the

Environmental Testing: Finding Hidden Client Assumptions

[3:01]Grounding check passed a draft that invented a ranking, which is why there are four checks now and not one. Your turn. Paste this into Claude. Take a test you trust and find what it supplies that a real caller would not. the working directory, an environment variable, an already running process, then withhold one and run it again. Mine passed three times before a real client ever reached it. Serving the panel over MCP and freezing the signal contract. Week 10 of the private I valuation agent Am Mali for humanitarians. The eye.

More from Mycroft Financial AI

Humanitarians AI Lyrical Literacy Project