facts-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLINTH_DATA_DIR | No | Where the registry lives. Give each client its own: one server per directory | ~/.plinth |
| PLINTH_FACTS_ALLOW_HOSTS | No | Comma-separated host:port pairs. Required when PLINTH_FACTS_NET_PROFILE is allowlist; refused by the other profiles. | |
| PLINTH_FACTS_NET_PROFILE | No | Network profile: deny-all, loopback, private or allowlist. If set to allowlist, PLINTH_FACTS_ALLOW_HOSTS is required. | loopback |
| PLINTH_FACTS_MAX_REDIRECTS | No | Hops a call may follow when it asks to (0–20) | 5 |
| PLINTH_FACTS_DEFAULT_STALE_SECONDS | No | stale threshold when a query gives none | 3600 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| facts.measure.httpA | Make one HTTP request and return the raw status, headers and body, with the time it was observed and the IP actually connected to. Measures from the server's network position. It does NOT judge the result: a 500 received cleanly is a successful observation (ok:true, http_status 500). It does not check the status against an expectation, does not validate the body, does not retry, and does not follow redirects unless asked. |
| facts.measure.wsA | Connect to a WebSocket, listen for a given number of seconds, and return the messages that arrived, each with its absolute time and its offset from the open. Measures from the server's network position. Zero messages is a valid observation, not an error: it does NOT wait for a particular message, does not interpret payloads, does not reconnect, and does not say whether silence is a problem. |
| facts.recall.assertA | Write a claim into the project registry: statement, evidence, who observed it and when. It does NOT measure anything and it does NOT check that the evidence supports the statement — that would be interpreting. It checks only that the evidence exists and belongs to this project, and embeds it so the claim stays auditable. |
| facts.recall.historyA | Return the raw events of one claim, in order, exactly as they sit in the log. This is the auditable proof that nothing was rewritten: an assert, then a retract if there was one. |
| facts.recall.queryA | Read claims from the project registry. It NEVER measures and opens no sockets: it returns what was recorded, each claim with its own age and stale mark, plus remeasure_with — the tool and arguments to measure it again yourself. Retracted claims are hidden unless asked for; they are never gone. |
| facts.recall.retractA | Mark a claim as retracted, with a reason and an author. The claim is NEVER deleted: the original line stays byte for byte and the retraction is a new event. There is no delete tool and no parameter that removes anything. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 6 tools
The two namespaces (measure vs recall) cleanly separate observing the network from recording claims, and within each namespace the actions are distinct. measure.http vs measure.ws differ by protocol, while recall.assert/query/retract/history map to write, read, soft-delete, and raw audit respectively, with descriptions reinforcing the boundaries. No two tools can be plausibly confused.
Every tool follows the same dotted namespace pattern facts.<domain>.<action> with a single lowercase verb, producing two tidy groups (measure.* and recall.*). The convention is applied uniformly with no camelCase/snake_case mixing or stray verb styles.
Six tools is well scoped for the domain: four cover the fact-log lifecycle (assert, query, retract, history) and two cover measurement (http, ws). Each tool has a clear, non-redundant role and nothing feels padded or missing at the count level.
The immutable-log lifecycle is complete: assert, query, retract (with history as the audit trail), and deliberately no update/delete, which is defensible by design. Measurement covers http and ws, but other network probes (DNS, ping, TCP) are absent, a minor gap if broader measurement was intended.