Release notes for version 0.5.0 of an Elixir MCP server library adding topology-based reachability queries, dominator trees via Lengauer-Tarjan, opaque pagination, and tightened sign vocabulary.
Adapted from @aylacroftTwo days ago I put a fruit fly's brain in my MCP server. Today it can answer questions. 0.5.0 is on hex. 0.4.0 drew the wiring diagram, declared against observed, drift as a finding, & you could stare at it. This one lets you ask the graph a question it has to answer with its own edges. Can this entry point reach that effect without crossing an approval node. That is a dominator question, not a vibe, and the answer is yes or no. When it is no you get a witness path made of the graph you handed in, so you can walk the bypass yourself instead of trusting a score. reachable?/4, reachable_without/5, dominates?/4, mandatory_pass/3. Built on :digraph, which already ships with OTP, so it cost zero new dependencies. Lengauer-Tarjan for the dominator tree because neither :digraph_utils nor libgraph has one. Fourteen to twenty-five milliseconds on a ten thousand edge fixture. all_paths is refused. Always. Enumeration is not what this is for, & the refusal lives in the module so a well meaning PR cannot improve it away later. Also on the wire: resources & prompts with opaque keyset pagination, connectome://declared, connectome://observed and connectome://diff as read-only resources, and MRTR named as out with the reason written down. Every request is answered complete or refused. No half-open round trip sitting in the server hoping you come back. Two things people are going to mash together in a pitch deck, so I am going to be a bitch about the difference. Reachability answers topology. What shipped is every path to this effect crosses this node. What did not ship is a deny cannot be bypassed. Those sound identical at a standup and they are not the same claim. Signs are still not decided in this package, by design. @minitru asked what :unknown meant and found a real hole. It was doing two jobs at once, not mine to say and nobody decided yet. It is :unset now. No sign has been supplied to this package. Not that none exists out in the world. The old wording claimed no policy had spoken, which is a claim about the planet that a library has no business making. :ungoverned is new. A host can say this edge deliberately needs no gate. The package will never treat that as hide it. The diff still records it and still flags drift on it, because the frameworks do not lose their minds over exemptions, they lose their minds over undocumented ones. There is a test proving no code path anywhere filters or hides an edge based on its sign. Boring but I ate it so you do not have to. Docs ship in the tarball now. Every relative link on https://t.co/OQIDJLd6rw was a 404 in 0.4.0 and I did not notice until a test over the built artifact told me. Conformance runs against the official MCP suite in CI and publishes two rows, suite total and claimed surface, because one number without the other is how you lie with a green check. There is a will-not-implement page with twelve entries and a census test for each. No key holding. No signature making. No session identifiers. No OAuth. No client library. No authority decided. The tests are the proof. The page is the contract. Otherwise an issue tracker eats a boundary one reasonable request at a time, and I have watched that movie at DEF CON with worse lighting. Pin ~> 0.5.0, not ~> 0.5. Sign vocabulary broke, schema_version is 2, :unknown is refused on the way in. 0.x still breaks at the minor on purpose. Apache 2.0. Elixir. Still works standalone with nothing else of mine installed. https://t.co/KpuuzfZqV5