agent-fact-system
Provides Obsidian-compatible Agent projections, enabling the use of an Obsidian vault as a derived knowledge view synced with the canonical store.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agent-fact-systemwhat facts and evidence exist on renewable energy?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Agent Fact System
中文 | English
Lightweight. Fast. Unconstrained.
Agent Fact System, or AFS, is a local-first knowledge system for reasoning agents. It keeps facts, evidence, revisions, documents, retrieval indexes, and audit history outside the model context, then exposes them through a compact CLI and a thin stdio MCP server.
AFS is purpose-built for the working style of frontier models such as DeepSeek V4 Pro. These models can plan, call tools, compare evidence, and revise conclusions. They work better with a small deterministic knowledge surface than with a large application framework surrounding them.
The design target is model-class specific and provider neutral. AFS does not contain a DeepSeek-only adapter and does not require a particular chat runtime. DeepSeek V4 Pro, another frontier model, or a local Agent can use the same contracts.
Why AFS exists
A strong model can reason across a difficult task. It still needs a reliable answer to a simpler question. What is true now, where did that claim come from, and what changed since the last run?
AFS gives the Agent one factual authority with explicit evidence and readback. The model remains free to reason. The knowledge layer stays small, inspectable, and recoverable.
Related MCP server: gbrain
What is implemented
A transactional SQLite canonical store for facts and practices
Evidence-bound proposals, revisions, status transitions, and idempotent writes
Append-only Timeline events and revision history
A portable Markdown document store with stable slugs and source line locators
Structured, full-text, temporal, vector, and hybrid retrieval
Tags, links, backlinks, and partial document resolution
Extractive answers with citations
A fixed allowlist of 14 Agent-facing MCP tools
A thin JSON CLI for local operation and administration
Rebuildable local and vector indexes
Obsidian-compatible Agent projections and a narrow command inbox
Verified backup, restore, health, and drift checks
Fail-closed sensitivity rules that keep restricted content out of FTS, projections, exports, and remote embeddings
Optional one-time GBrain migration and private cold-archive support
Why it fits DeepSeek V4 Pro class models
AFS gives a high-end Agent a compact set of operations instead of another orchestration framework.
Small tool surface The MCP interface is capped at 14 tools.
Deterministic contracts JSON schemas, idempotency keys, revision checks, and canonical readback make tool results verifiable.
Evidence stays close Claims carry source locators, excerpts, hashes, and Timeline history.
Context stays lean The Agent retrieves the exact record or document span it needs.
Reasoning stays free AFS governs stored knowledge without prescribing how the model plans or thinks.
The runtime stays light Python, SQLite, three direct runtime dependencies, and no mandatory daemon.
This is what “unconstrained” means here. AFS does not try to become the Agent, the planner, or the application shell. It provides durable knowledge and gets out of the way.
Architecture
Agent or MCP client
|
v
CLI / stdio MCP
|
+-------------------+
| |
v v
Canonical SQLite Markdown documents
| |
+---------+---------+
|
v
Rebuildable derived views
FTS / Timeline / vectors / VaultCanonical data remains authoritative. Full-text indexes, vector generations, and Vault projections can be rebuilt.
Quick start
AFS requires Python 3.12 and uv.
git clone https://github.com/leoge007/agent-fact-system.git
cd agent-fact-system
uv sync --locked
export AFS_HOME="$HOME/.local/share/agent-fact-system"
install -d -m 0700 "$AFS_HOME"
uv run afs init --json
uv run afs doctor --jsonCreate a candidate fact through the public CLI.
uv run afs record propose --input - <<'JSON'
{"kind":"fact","subject":"projects/quickstart","claim":"AFS stores evidence-backed facts.","evidence":[{"locator":"inline:quickstart","excerpt":"AFS stores evidence-backed facts."}],"idempotency_key":"quickstart:propose:1"}
JSONBuild the local index and query it.
uv run afs index sync --json
uv run afs query 'evidence-backed facts' --mode fulltext --jsonSee docs/quickstart.md for MCP setup, documents, vectors, backup, and restore.
MCP setup
Any stdio MCP client can launch AFS with an explicit data directory.
{
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/agent-fact-system",
"run",
"python",
"-m",
"afs.mcp"
],
"env": {
"AFS_HOME": "/absolute/path/to/afs-data"
}
}The repository also includes an Agent routing Skill at skills/agent-fact-system/SKILL.md.
Retrieval and embeddings
Local structured, full-text, temporal, and document retrieval work without a network service. Vector and hybrid retrieval are optional.
The current remote embedding adapter uses SiliconFlow with Qwen/Qwen3-Embedding-8B. Only records marked normal are eligible for remote embedding. Restricted content fails closed before an HTTP request is made.
export SILICONFLOW_API_KEY='...'
uv run afs embedding preflight --json
uv run afs index vector --json
uv run afs query 'your question' --mode hybrid --jsonDeliberate boundaries
AFS currently targets Python 3.12. It does not run a daemon, scrape conversations automatically, promote model output into confirmed facts, or hide provider failures behind silent fallback. Owner-level mutations remain outside the normal MCP surface.
The remote embedding adapter is currently specific to SiliconFlow. The Agent model itself remains independent of that adapter.
Verification
uv sync --locked
uv run pytest --ignore=tests/liveLive embedding tests require an explicit API key and network authorization.
License
MIT
Available Tools
14 toolsdocument_backlinksB
List incoming document links when the capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosure. It mentions a conditional requirement ('when the capability is installed') but does not explain behavior when the capability is missing, error scenarios, or any other side effects. Minimal transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and resource with no fluff. It earns its place, though brevity comes at the cost of completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter listing tool, the description provides the basic return expectation ('list incoming document links') but lacks detail on the 'capability' prerequisite, error handling, or how slug is used. No output schema exists, so the description is the only source of return information, making it somewhat incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage and the tool description does not explain what 'slug' refers to. This is a single required parameter with no semantic guidance in either the schema or description, leaving the agent without enough information to correctly supply it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list) and the resource (incoming document links), distinguishing it from the sibling tool document_links which likely lists outgoing links. The phrase 'incoming' adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing backlinks but provides no explicit comparison to alternatives or exclusions. The caveat 'when the capability is installed' hints at an availability condition but does not clarify when to prefer this tool over document_links.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_getC
Read a document when the optional document capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the sole behavioral source. It mentions the capability requirement, but it doesn't disclose error behavior (e.g., 404 on missing slug), return format, or side effects. 'Read' implies non-mutating, but this isn't explicit or elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the action, and every word contributes meaning. It is appropriately concise for a simple tool, though it borders on under-specified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, and only one parameter, the description is incomplete. It doesn't explain the slug parameter, error handling, or how to handle the capability prerequisite. A more complete description would include these details to ensure confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single required parameter 'slug' with no description, and the tool description makes no mention of it. With 0% schema coverage and no parameter explanation, the agent must guess that slug identifies the document. The description adds no semantic value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a document, using a specific verb and resource. It implicitly distinguishes from sibling tools like document_search and document_list, which handle discovery rather than retrieval. However, it doesn't specify that it retrieves a single document by slug, leaving a slight gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite ('when the optional document capability is installed') but no guidance on when to choose this tool over alternatives such as document_search or document_list. It doesn't contrast with siblings or explain what to do if the capability isn't present, leaving the agent without clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_linksB
List outgoing document links when the capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It indicates a read/list operation but lacks detail on side effects, required permissions, error behavior, or what 'capability' means. It adds only a conditional availability note, which is useful but insufficient for full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no unnecessary words. It front-loads the action and resource, making it immediately clear what the tool does.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool, the description is minimally adequate. However, it omits return format, pagination, and details about what 'outgoing document links' entails. The lack of output schema makes these omissions more noticeable, but the tool's simplicity keeps the gap moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage for the sole required parameter 'slug'. The description does not mention or explain this parameter, leaving the agent to infer its meaning from the name alone. Since schema coverage is low, the description should compensate but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists outgoing document links, a specific verb and resource. The phrase 'when the capability is installed' adds a condition, and the name distinguishes it from siblings like document_backlinks (incoming links) and document_list (documents).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus alternatives. The condition 'when the capability is installed' hints at a prerequisite but does not explain the tool's place among similar document tools such as document_backlinks or document_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_listB
List documents when the optional document capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden. It discloses that the tool depends on an optional capability, which is useful context. However, it does not mention that this is a read-only operation, the return format, pagination, or any other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no wasted words. However, conciseness is not under-specification; the description could have used one or two more sentences to clarify usage or output, which would improve value without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description still needed to provide more context about when to use it and what it returns. It only mentions the optional capability, leaving the agent without enough information to decide between this and sibling document tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is nothing for the description to explain. The baseline for no-parameter tools is 4, and the description adequately covers the operation's scope without needing parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('documents'), clearly indicating the tool's function. The conditional 'when the optional document capability is installed' adds context, but it does not distinguish this from the sibling document_search tool, which could also list documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only mentions a prerequisite ('when the optional document capability is installed') but provides no guidance on when to use this tool versus alternatives like document_search. There are no explicit scenarios or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_putC
Put a document when the optional document capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It does not mention side effects, idempotency, authentication, error behavior, or what happens on success/failure. The only 'behavior' is a capability prerequisite, which is not informative about the operation itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words. It is concise and easy to parse, though its brevity comes at the cost of necessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity (2 required params), no annotations, and no output schema, the description is severely under-specified. It lacks behavioral context, parameter guidance, and any mention of return values or side effects, leaving the agent to make many assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fails to mention 'slug' or 'content'. There is no explanation of what each parameter represents, whether slug is a key for lookup, or what format content should take. The description adds no parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Put') and resource ('document'), indicating a write operation. It is clear enough to distinguish from sibling read/search tools, but the verb 'put' is vague about whether it creates, replaces, or updates a document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The phrase 'when the optional document capability is installed' is a prerequisite condition, not usage guidance, and no exclusions or alternative tool references are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_resolveC
Resolve a partial document slug when the capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| partial | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions a prerequisite ('when the capability is installed') but does not state whether the operation is read-only, what happens if the capability is absent, or what the resolution behavior or return value is. This is a significant transparency gap for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, front-loading the core action ('Resolve a partial document slug'). The conditional clause 'when the capability is installed' adds relevant context without bloat, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having only one parameter and no output schema, the description is too minimal to be complete. It omits critical context such as the return format, error behavior, what 'capability installed' means, and how this tool relates to document_get or document_search, leaving an agent underinformed for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only describes 'partial' as a string with minLength 1, while the description adds that it is a 'partial document slug,' giving the parameter semantic meaning beyond the raw schema. However, it does not provide format details, examples, or how the partial slug is interpreted, so compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'resolve' and identifies the resource as a partial document slug, which is distinct from sibling tools like document_get and document_search. However, it doesn't clarify what 'resolve' produces (e.g., a full slug, document ID, or list) nor what 'capability is installed' means, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like document_get or document_search. The only implied context is having a partial slug and an installed capability, but there are no exclusions, prerequisites beyond the vague capability note, or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_searchC
Search documents when the optional document capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only notes the optional capability, but does not state whether the operation is read-only, what the return format is, or how it behaves across different modes. This is minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no unnecessary words. It is not tautological and is structured effectively, but it could have used additional space to explain more, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 parameters, no annotations, and no output schema, so the description must provide complete context. It only mentions the optional capability and fails to describe return values, error conditions, or how search modes affect behavior, making it insufficient for reliable use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no explanation of the query, mode, or limit parameters. The enum values (fulltext, vector, hybrid) are self-naming but their semantics (e.g., hybrid combines fulltext and vector) are not explained, leaving the agent to guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool searches documents, which is a clear verb+resource. However, it does not differentiate from sibling tools like document_list or fact_search, and the 'optional document capability' adds context but not scope or distinctiveness.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'when the optional document capability is installed', which is a prerequisite, not a usage guideline. There is no mention of when to use this tool instead of document_list, fact_search, or other document tools, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
document_tagsC
List tags for a document when the capability is installed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It only mentions the capability condition, but does not disclose behavior such as errors when capability is missing, output format, authentication, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that communicates the core action and a condition. It is front-loaded and wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and one undocumented parameter, the description is insufficiently complete. It does not describe the output, how slug is used, or behavior under the capability condition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required parameter 'slug' with zero description. The tool description does not explain what 'slug' refers to (e.g., document identifier). With 0% schema coverage, the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List tags for a document'. The verb 'List' and resource 'tags' are specific, and it is distinct from sibling tools like document_get or document_links.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The phrase 'when the capability is installed' only indicates a prerequisite, not a usage context or exclusion. No alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fact_getB
Read one canonical AFS fact or practice record.
| Name | Required | Description | Default |
|---|---|---|---|
| history | No | ||
| record_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. The verb 'Read' conveys it is a non-mutating operation, but it does not disclose other behavioral traits such as whether the history parameter returns past versions, what fields are returned, or any potential side effects. It is not misleading but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no wasted words. It is front-loaded with the action and resource, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, and the description does not explain the return format or the semantics of the 'history' parameter. Given the simplicity of the tool, the description covers the core fetch action, but important context about history and return values is missing, making it incomplete for a reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, and the description does not mention either parameter (record_id or history). It adds no meaning beyond the schema field names, so the agent receives no guidance on how or when to set history or what record_id format is expected beyond the pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Read') and a specific resource ('one canonical AFS fact or practice record'). It distinguishes itself from sibling tools like fact_search (searching) and fact_propose (proposing new facts) by emphasizing 'one canonical' record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'one canonical' implies this tool is for retrieving a single, specific record, but it does not explicitly state when to use this versus alternatives like fact_search or document_get. It offers implied context without clear exclusions or mentions of other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fact_proposeC
Propose a candidate fact or practice through the canonical service.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| tags | No | ||
| claim | Yes | ||
| reason | No | ||
| body_md | No | ||
| subject | Yes | ||
| evidence | Yes | ||
| attributes | No | ||
| valid_from | No | ||
| observed_at | No | ||
| valid_until | No | ||
| idempotency_key | Yes | Caller-supplied idempotency key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It does not disclose whether proposing creates a record immediately, requires approval, or has side effects. The required idempotency_key's role is also not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, efficient and front-loaded with the core action. However, 'through the canonical service' is filler that adds no real information, slightly reducing its structured value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters, nested objects, no output schema, and no annotations, this one-sentence description is profoundly inadequate. It does not explain what a proposal entails, how evidence is structured, or what the agent should expect in response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 8%, with only idempotency_key having a description. The description adds minimal semantic value by hinting that `kind` is 'fact or practice,' but it does not explain evidence structures, subject format, or temporal fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Propose a candidate fact or practice,' identifying the action (propose) and the resource (fact/practice). This distinguishes it from siblings like fact_get and fact_search, which are retrieval operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It lacks any context about prerequisites, exclusions, or choosing between fact_propose and other tools like fact_search or document_put.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fact_searchC
Search AFS through the existing canonical-adjudicated query service.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | ||
| kind | No | ||
| mode | Yes | ||
| text | Yes | ||
| limit | No | ||
| status | No | ||
| subject | No | ||
| time_axis | No | ||
| min_content_seq | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, but it only mentions 'the existing canonical-adjudicated query service.' It does not disclose whether the operation is read-only, how results are ordered or filtered, what statuses are included, or any side effects, leaving the agent to infer behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundant wording, making it efficient. However, it is too sparse to be fully self-contained, though that issue is captured in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, a complex conditional schema, no annotations, and no output schema, the description is severely incomplete. It fails to explain the query modes, time axes, record kinds/statuses, filtering options, or any response shape, leaving most operational context absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 9 parameters with 0% description coverage, and the description adds no parameter-level information. The terms 'text' and 'mode' are required but their meaning and interaction (e.g., mode enum values like 'temporal' or 'hybrid') are entirely unexplained in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a search action and a resource ('AFS'), so it is not a tautology. However, 'AFS' is undefined and there is no differentiation from sibling tools like document_search or fact_get, making the exact scope of the search unclear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as fact_get, timeline, or document_search. It only states what the tool does, with no exclusions, prerequisites, or contextual usage signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthB
Run the existing offline AFS doctor report.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It implies a read-only diagnostic report ('doctor report') but does not state whether it modifies data, what it returns, or any side effects. This is a significant gap for a tool that runs a report.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence of seven words. It is front-loaded with the verb and resource, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description is minimally adequate: it states the action and target. However, it does not clarify what 'AFS doctor report' contains, what 'offline' implies, or what the output will be, which could confuse an agent unfamiliar with the domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description does not need to add parameter details; the empty schema is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Run' and identifies a clear resource: 'the existing offline AFS doctor report.' It distinguishes from sibling tools that deal with facts, documents, timeline, or stats, though the exact nature of the report is not elaborated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. The description only states what it does, leaving the agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statsA
Read the existing local index status and canonical watermark statistics.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral disclosure burden. It communicates a read-only operation via the verb 'read,' but lacks additional traits such as performance implications, return format, or side effects. This is minimal but viable for a simple stats tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. Every word contributes to the purpose, making it exceptionally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter, read-only nature, the description covers the core behavior. However, without an output schema, the terms 'canonical watermark statistics' are not elaborated, leaving a minor gap in understanding what the returned stats actually contain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain parameter semantics. The baseline for 0 params is 4, and the description provides no unnecessary parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads 'local index status and canonical watermark statistics,' using a specific verb and resource. This distinguishes it from sibling tools like fact_get and document_get, which target different data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for checking index status and watermark statistics but provides no explicit context, exclusions, or comparisons to alternatives. There is no guidance on when to prefer this tool over siblings like health or timeline, so it meets the baseline for implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timelineC
Read canonical Timeline events with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| actor | No | ||
| since | No | ||
| until | No | ||
| record_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full behavioral burden. It only says 'Read' which implies non-destructive operation, but it doesn't disclose return format, ordering, pagination, filter behavior, or what 'canonical' means. The description adds minimal value beyond the verb.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loads the verb 'read' and the resource, and contains no filler. It is concise and well-structured, though it sacrifices depth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters, no output schema, and no annotations, the description is incomplete. It does not describe what the tool returns, how filters interact, or what 'canonical' means. This bare-minimum description leaves significant gaps for an agent attempting to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only mentions 'optional filters' without naming or explaining any of the four parameters (actor, since, until, record_id). No parameter-level meaning or relationships are conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Read') and a specific resource ('canonical Timeline events'), with optional filters. This distinguishes it from sibling tools like fact_get or document_get, which operate on different data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as fact_get or document_search. The term 'canonical' hints but does not explicitly state when this should be preferred over other read-oriented sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct resource/action: fact_get, fact_search, and fact_propose cover fact reading and proposing; timeline, health, and stats are separate system views; the eight document_* tools each perform a unique operation on documents. There is only a very minor overlap between health and stats, but their descriptions clearly differentiate them.
The fact_* and document_* tools use a prefix-plus-verb pattern (fact_get, document_put), but timeline, health, stats are bare nouns, and document_tags, document_links, and document_backlinks are noun-noun constructions. The mixed conventions are readable but not consistent enough for a high score.
Fourteen tools is within the well-scoped range for a system that manages facts and optional document capabilities. Each tool has a clear purpose, and the count is reasonable for the domain.
The fact lifecycle covers get, search, and propose, which is appropriate for a canonical/adjudicated system. Document tools cover get, list, search, put, resolve, tags, links, and backlinks, but there is no explicit delete operation for documents or facts, which is a minor gap.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Self-hosted AI-native knowledge workspace with hybrid search, GraphRAG, and MCP.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server exposing a deterministic, local knowledge graph over stdio. Zero LLM calls in the bridge; answers are classified as Fact, Inference, or Unknown and persisted in redb (ACID, BLAKE3-hashed).1014Apache 2.0
- AlicenseNot gradedqualityCmaintenanceA local-first compiled knowledge graph MCP server that provides structured memory for AI agents with full-text search, vector embeddings, and timeline tracking.4158MIT
- AlicenseNot gradedqualityBmaintenanceLocal-first MCP server for indexing and searching research materials (papers, notes, logs, READMEs) using SQLite FTS, with tools for memory management and evidence retrieval.MIT
- AlicenseNot gradedqualityBmaintenanceAn embedded knowledge graph in one SQLite file, exposing a MCP server for agents to read and write entities and relationships with full audit trail and time travel.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/leoge007/agent-fact-system'
If you have feedback or need assistance with the MCP directory API, please join our Discord server