mcp-context-card
An MCP server that gives a project context, memory, and identity, discoverable by any MCP client.
Read AGENTS.md — return the whole file or just one section by heading
List sections — see headings so a client can fetch only what it needs
Author AGENTS.md — draft one from real repo facts (BETTER/BEST), without writing files
Persist memory — remember, recall, and forget facts that survive server restarts
Identify the server — whoami returns name, vendor, version, status, license
Discover context sources — list what media types and surfaces the project publishes
Render the card — generate a self-contained HTML page with identity, AGENTS.md, memory, and discovery info
Run over stdio or HTTP — supports both transports, plus .well-known routes and GET /card
Compose with existing MCPs — run alongside other servers to add context, memory, and identity to any host
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., "@mcp-context-cardremember that the production endpoint is https://api.faf.one"
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.
mcp-context-card
Get one. Or add it to yours. The essential MCP server for a project's context, memory, and identity — discoverable to any MCP client, and rendered as one card you can read.
Light | Dark |
|
|
context — the project's AGENTS.md, served whole or one section at a time.

memory — facts that persist across sessions, in a file.

identity — what this server is, from its own Server Card.

Discovery goes through two surfaces already in the ecosystem: the Server Card
_meta block and ai-catalog.json sibling entries.
Pick one
You want to… | |
Add an |
|
Improve an | the same tool, automatically — drop in a |
Get a new MCP server base — context, memory, identity, wired | stand this up as-is; a host has all three before you write a tool of your own |
Improve your MCP with context, memory, ID — you already run one | run it alongside your existing server; nothing to migrate, it composes |
Related MCP server: terminal-mcp
A base MCP — or an extension for any other
Context, memory, and identity are essential — every MCP host needs an agent
that knows a project's instructions, remembers facts across sessions, and can
say what it is. mcp-context-card is those three, done once:
Stand it up as your base MCP. Point a host at it and an agent already has
AGENTS.mdserved section‑by‑section,remember/recall/forgetmemory that survives a restart, and awhoamiidentity — before a single tool of your own is written.Or extend any existing MCP with it. Run it alongside a server you already have — filesystem, git, a database, your own — and that agent gains context, memory, and identity discovery it didn't have. Nothing to migrate; it composes.
Nine tools, two discovery surfaces already in the ecosystem (Server Card
_meta, ai-catalog.json), and a rendered card. MIT, on npm.
It composes:
serve · discover · render — this server
author BETTER, keep true —
agents-md-facts(author_agents_mdwraps it for the facts layer; adds a BEST layer of its own fromproject.fafwhen one exists)files · shell · git —
server-filesystem,server-git/ github‑mcp‑server, your test runner's MCP
Vendor-free — context is plain Markdown (AGENTS.md); the memory and
identity formats are swappable examples. It reads and writes only its own
three files (AGENTS.md, project.fafm, .well-known/fafa) — no general
file access, no shell, no search.
The card
The screenshot at the top of this page is exactly this — the same three
sources rendered as one self‑contained HTML page: identity, AGENTS.md,
memory, and how a machine fetches it. The view for people: read it, screenshot
it, drop it in a PR, put it on a status page.
AGENTS.md sections are collapsed by default, so the card scans in one screen;
a sticky index jumps to any section, Expand all opens everything. Sections
toggle natively — the one small inline script only adds the bulk button and the
print handler. --expanded / ?expand=all renders it fully open, script-free,
for a screenshot.
npx mcp-context-card card # at a terminal: writes context-card.html and opens it
npx mcp-context-card card --expanded # every section open
npx mcp-context-card card > x.html # piped/redirected: raw HTML to stdout
GET /card # live, on the HTTP transport
GET /card?expand=all&theme=light&accent=%230066ccLight, dark, or auto; the accent defaults to the AAIF palette and takes any hex. This repo's own card, live: auto · light · dark (all in the AAIF accent shown here — pass any hex to change it).
Add it to your setup
No AGENTS.md yet?
The author_agents_md tool authors one — BETTER from your repo's real
facts (build/test commands, entry points, toolchain conventions, via
agents-md-facts), or
BEST when a project.faf exists: the same facts, plus its structured
goal, who it's for, and why, as a section ahead of them. Nothing to
configure — the tier follows what's actually there.
(The ladder this follows.)
To author or keep the facts layer true outside a session:
npx agents-md-facts # author / refresh AGENTS.md
npx agents-md-facts --check # fail if missing or stale (CI, pre-commit)See the card
One command, no host, no config — from your project directory:
npx mcp-context-card cardAt a terminal it writes context-card.html and opens it in your browser. Piped
or redirected (> card.html, a script, CI) it writes raw HTML to stdout instead;
--stdout forces that from a terminal too. --expanded opens every section.
Wire it into a host
Claude Desktop, Cursor, or any stdio host:
{
"mcpServers": {
"context-card": {
"command": "npx",
"args": ["-y", "mcp-context-card"],
"env": { "MCP_CONTEXT_CARD_ROOT": "/abs/path/to/your/project" }
}
}
}MCP_CONTEXT_CARD_ROOT points at the directory with your AGENTS.md. The
memory tools work with or without it; identity is optional. Over HTTP instead:
PORT=8080 npx mcp-context-card. Requires Node ≥20.
If command: "npx" fails to spawn (spawn npx ENOENT — seen on Cursor, whose
host process doesn't inherit a shell PATH), point command at node and
the installed dist/bin.js instead — see
docs/WIRING.md. Transport choice is
in docs/TRANSPORT.md.
Extending an MCP you already run: most hosts accept more than one
mcpServers entry — add context-card alongside server-filesystem,
server-git, or your own, and every agent in that host gains context,
memory, and identity discovery without anything else changing.
Why
AGENTS.md is the de-facto standard for telling a coding agent how to work in a
repo. But a client has to know the file exists and read the whole thing into
context. There is no standard way for a server to say "here is my AGENTS.md,
here is what I remember, here is who I am" — so every server that wants this
grows its own shape.
mcp-context-card answers all three through mechanisms that already exist:
Server Card
_meta(SEP‑2127) — one reverse‑DNS‑namespaced key per concern, readable in‑band as an MCP resource and atGET /.well-known/mcp/server-card.ai-catalog.json— sibling entries keyed by media type, atGET /.well-known/ai-catalog.json.
The context concern points at AGENTS.md (text/markdown). Memory and identity
have no de‑facto standard yet, so the examples here use
.fafm and
.fafa — one instantiation each,
swap in your own.
The wire‑level detail is in docs/MECHANISMS.md.
Tools
Tool | What it's for |
| draft an |
| return the project's |
| the headings, so a client pulls one section instead of the whole file |
| write a fact that will still be there next session |
| read a fact stored in a previous session |
| drop or correct a stale fact |
| this server's name, vendor, version, status, license |
| what this project publishes, in what media types, via which surface |
| the whole card as one self‑contained HTML page (also |
The demo
npm run demo runs every tool over both transports:
Context — list the
AGENTS.mdsections, then pull just## Test.Memory —
remember()a fact, stop the server process, start a new one,recall()the same fact. Only the file carries it across.Identity —
whoami(), and the Server Card_metablock read back from a live client.Discovery —
list_context_sources(), then the same server over stateless HTTP with its.well-knownroutes andGET /card.
104 tests on Linux, macOS, and Windows, coverage‑gated in CI. Two spawn a real
child process and check a remembered fact survives the restart — one against
an existing project.fafm, one starting from a project that has never had
one; another checks the stdio and HTTP tool surfaces match.
Layout
Path | What |
| the nine tools + the Server Card resource |
| reads and section‑splits |
|
|
| a minimal dependency‑free Markdown → HTML renderer |
| the card — identity + |
| file‑backed |
|
|
| writes |
| the stateless Streamable HTTP app (Hono) |
| the entry point — |
Related
mcp-project-context— an earlier take on the context concern alonetext/markdown(AGENTS.md) ·application/vnd.fafm+yaml·application/vnd.fafa+yaml
License
MIT.
This repo dogfoods what it serves — its AGENTS.md is a real, current file, and
it ships a project.faf as the structured source behind it.
Available Tools
9 toolsauthor_agents_mdA
Author an AGENTS.md for this project and return the draft — BETTER from repo facts alone (via agents-md-facts: real build/test commands, entry points, toolchain conventions, nothing invented), or BEST when a project.faf exists (facts plus its structured goal/who/why as a second managed block ahead of them). Does not write a file.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does this well: it explicitly states the tool returns a draft, does not write a file, relies only on repo facts or project.faf content, and 'nothing invented.' This gives the agent a reliable model of side effects and output trustworthiness.
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 two sentences with the core purpose front-loaded. Every clause adds necessary information: source of facts, quality tiers, and the non-write side effect. It avoids repetition of schema or annotation details, so there is no wasted text.
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 complete: it explains what the output is (a draft), what data feeds it, when the result is better or best, and that it does not modify the filesystem. An agent can decide whether and how to invoke this tool without ambiguity.
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 and 100% coverage, so there are no parameter semantics to clarify. The description still adds relevant semantic context by distinguishing the BETTER and BEST input states based on whether a project.faf exists, which helps the agent understand what determines output quality.
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 opens with a specific verb and resource: 'Author an AGENTS.md for this project and return the draft.' It also clearly isolates this tool from its siblings by framing it as draft generation rather than reading or listing existing AGENTS.md content, and it emphasizes that no file is written.
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 gives clear contextual guidance on when output is BETTER versus BEST, specifically depending on whether a project.faf exists. It does not explicitly name sibling alternatives such as read_agents_md, but the purpose and the non-write guarantee make the intended usage clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetA
Remove a fact by id — to correct or drop something stale. A missing id is reported, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The exact id of the fact to remove. Reports whether a fact was actually removed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses one useful behavior: 'A missing id is reported, not an error', and mentions it reports whether removal occurred. However, it doesn't address permanence, side effects, or error output format for a destructive operation.
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?
Two brief, information-dense sentences. The core action and purpose are front-loaded, and every word contributes 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?
For a simple one-parameter tool, the description plus schema cover core use, error behavior, and removal reporting. No output schema exists, but the 'reports whether' statement gives sufficient guidance. A bit more on side effects or return format would improve completeness, but it's nearly sufficient.
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 100%, so the baseline is 3. The description only restates 'by id' and the schema already documents the 'reports whether a fact was actually removed' behavior, adding no new 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 states a specific verb and resource: 'Remove a fact by id'. It also adds context on why ('to correct or drop something stale'), and the sibling set (remember, recall) makes the distinct purpose clear.
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 gives clear usage context with 'to correct or drop something stale', implying when to use this tool. It doesn't explicitly list alternatives or when-not-to-use scenarios, but the intention is fairly clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agents_md_sectionsA
List the headings in this project's AGENTS.md, so a client can pull one section instead of spending context on the whole file.
| 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 the full burden. It discloses that the output is a list of headings and frames the tool as context-saving, but it does not explicitly state that the operation is read-only, has no side effects, or how it behaves if AGENTS.md is missing. For a simple list operation, these are minor gaps but still present.
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 entire description is one concise sentence of about 24 words. The action is front-loaded ('List the headings'), and the rationale provides useful context without any filler.
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 listing tool, the description covers the action, the target, and the reason to use it. It does not specify the exact return format (e.g., plain list vs markdown), but since no output schema exists, a bit more detail about the response shape would improve completeness.
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?
There are zero parameters, so the baseline is 4 per rubric. The description adds meaning by saying 'this project's AGENTS.md', indicating the target is fixed to the current project and no path or filter argument is required.
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 a specific verb ('List') and a specific resource ('the headings in this project's AGENTS.md'), and explains the purpose ('so a client can pull one section instead of spending context on the whole file'). It clearly distinguishes this tool from siblings like read_agents_md, which reads the full file.
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 the use case: when a client wants to retrieve only the section headers rather than the full document. The phrase 'instead of spending context on the whole file' contrasts with reading the entire file, effectively pointing at read_agents_md as the alternative, but it does not name alternatives or state explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_context_sourcesA
What context does this project publish (AGENTS.md, memory, identity), in what media types, and through which discovery surface. For a client connecting cold.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses the kind of data returned (context sources, media types, discovery surface) and 'list' implies a read-only operation. However, it doesn't explicitly state there are no side effects or mention edge cases like empty results.
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 two concise sentences that front-load the core function and then add the usage context. Every word earns its place; no fluff.
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 and no annotations, the description fully captures what the agent needs: what the tool does, what it returns, and when to use it. Nothing critical is missing.
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 doesn't need to elaborate on inputs, and it doesn't omit anything relevant.
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 which context sources (AGENTS.md, memory, identity) are published, their media types, and the discovery surface. This is specific and distinct from sibling tools like read_agents_md or list_agents_md_sections.
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 gives a clear usage scenario: 'For a client connecting cold.' This tells an agent when to use the tool. It doesn't explicitly mention alternatives or when not to use it, but the scoped purpose makes it obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_agents_mdA
Return this project's AGENTS.md — the whole file, or one section by heading. The instructions a client would otherwise have to know to look for and read wholesale.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | A heading to return just that section (case-insensitive, prefix match). Omit for the whole file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. 'Return' implies a read operation and the whole-file-or-section scope is clear, but the description does not explicitly state it has no side effects, how missing sections behave, or any return-format details. It is adequate but not rich.
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 first sentence is concise, front-loaded, and behaviorally precise. The second sentence is somewhat non-essential and motivational, but it is short and helps position the tool's purpose without bloating the description.
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 read tool with full schema coverage, the description is nearly complete: it states what is returned and the available modes. The main gap is not explicitly disambiguating from list_agents_md_sections, though the verb 'Return' and 'section by heading' make the distinction reasonably clear.
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 100%, so the baseline is 3; the schema already documents the section parameter and the omit-for-whole-file behavior. The description adds only a slight contextual restatement ('or one section by heading'), providing no meaning beyond the 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 states a specific verb and resource: 'Return this project's AGENTS.md', and explicitly defines the two modes: whole file or one section by heading. This clearly differentiates it from sibling tools like author_agents_md (write) and list_agents_md_sections (list headings).
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 'The instructions a client would otherwise have to know to look for and read wholesale' implies this is the entry point for pulling project instructions, but it never explicitly says when to prefer this over list_agents_md_sections or when not to use it. Usage context is implied, not stated with exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallA
Retrieve a fact stored in a previous session by id. Exact lookup — not fuzzy or substring.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The exact id a previous remember call used. Returns the stored text, or a "no memory for <id>" message if nothing matches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Retrieve' conveys a read-only action, 'exact lookup' clarifies matching semantics, and the schema property description discloses the not-found response. This is adequate transparency for a simple lookup 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?
Two short sentences with no wasted words. The action and resource are front-loaded, and the precision qualifier is presented immediately after the main purpose.
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 one-parameter lookup tool, the description plus schema property cover the operation, id semantics, and missing-id outcome. It could be more explicit about when to prefer this over sibling tools, but nothing essential is missing for a correct 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?
Schema coverage is 100% and the id property already explains that it is the exact id from a previous remember call and what value will be returned. The description's 'exact lookup — not fuzzy or substring' reinforces behavior but adds little new 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 uses a specific verb ('Retrieve') and resource ('a fact stored in a previous session by id'), and the exact-lookup qualifier distinguishes it from fuzzy search behavior. It clearly positions this as the retrieval counterpart to remember.
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 the tool is for looking up a previously stored fact by exact id, but it does not explicitly say 'use this when you have an id from remember' or name an alternative for fuzzy/substring needs. The 'not fuzzy or substring' hint provides context but not concrete when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberA
Persist a fact past the session boundary — written to a .fafm file, not held in memory. Reusing an existing id replaces that fact's text in place (no duplicate); a new id appends. Facts are written verification_status: unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A stable key you choose for this fact — pass the same id later to recall or forget it. Exact match, case-sensitive, any string; keep it short and meaningful (e.g. "deploy-target", "db-url"). Reusing an id updates that fact rather than adding a second one. | |
| text | Yes | The fact itself, as plain prose. Stored verbatim and returned as-is by recall. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that facts go to a .fafm file rather than memory, that reusing an id replaces text in place, and that new ids append. It also exposes the written verification_status. It does not describe return or failure behavior, but the core side effects are clearly stated.
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?
Two tight sentences with the core purpose front-loaded. Every clause adds a distinct behavioral fact, and there is no filler or repetition.
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 two-parameter write tool with no output schema, the description covers persistence location, update/replace semantics, append behavior, and written status. The main gaps are the lack of a return-value/confirmation description and explicit failure modes, but these are minor at this complexity.
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 100%, and both id and text are already well-documented in the schema. The description mostly restates the id replacement semantics found in the schema, adding little parameter-level meaning beyond 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?
States the exact operation: persistently storing a fact past the session boundary, with explicit update-vs-append semantics. This clearly distinguishes it from read-oriented siblings like recall and read_agents_md.
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?
Gives clear context for when to use it: any fact that must survive the session or be updated by id. It does not explicitly contrast with recall/forget or state when not to use it, but the durable-write context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_context_cardA
Render the whole card — identity, AGENTS.md, memory, discovery — as one self-contained HTML page a person can read or screenshot. AGENTS.md sections collapse by default; pass expanded:true for the full render. Also served at GET /card (?expand=all) over the HTTP transport.
| Name | Required | Description | Default |
|---|---|---|---|
| theme | No | default: auto | |
| accent | No | CSS hex colour, e.g. #FF702D (default: the AAIF palette) | |
| expanded | No | render every AGENTS.md section open (default: collapsed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden. It discloses default collapsing behavior, the expanded parameter, and the HTTP alternative. It doesn't explicitly state read-only or side-effect-free, but 'render' implies no mutation.
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?
Two sentences, front-loaded with the main purpose, then additional details. No redundancy.
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?
All necessary information for invoking the tool is present: action, parameters, defaults, and alternative access method. Output format is succinctly described as an HTML page.
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 description adds meaning for 'expanded' by explaining the default collapse and the expanded:true toggle. The HTTP query parameter ?expand=all is also noted. Theme and accent are already well-documented in the 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 renders the whole card as an HTML page for reading or screenshotting, listing the exact components (identity, AGENTS.md, memory, discovery). This distinguishes it from sibling tools that recall, forget, or edit individual memory sections.
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 use for human-facing presentation but doesn't explicitly contrast with alternatives like read_agents_md or whoami. It does mention the HTTP endpoint, but lacks a clear 'when to use vs. not use' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiA
This server's own identity — name, vendor, version, status, license — from its .fafa card.
| 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 carries the behavioral disclosure burden. It discloses the source (.fafa card), the kind of data returned (identity fields), and implies a read-only introspection behavior. It could be more explicit about side effects or non-mutability, but for a simple identity query the disclosure is adequate.
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 well-structured sentence that leads with the core purpose and then enumerates the specific fields returned. Every word contributes meaning, with no filler or redundancy.
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, no-output-schema introspection tool, the description is complete: it names the identity source and lists the relevant fields an agent can expect. There are no hidden inputs, and the output scope is sufficiently specified.
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 accepts zero parameters, so there are no parameter semantics to document. The empty input schema is fully self-explanatory, and the description does not need to compensate for any schema gaps.
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 identifies what the tool returns: this server's own identity, explicitly listing name, vendor, version, status, and license from its .fafa card. This firmly distinguishes it from sibling tools that focus on agent markdown files, memory, and context sources.
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 makes it clear this tool is for retrieving server identity information, which is a distinct and self-contained purpose. It does not explicitly state when not to use it, but the contrast with sibling tools is strong enough that an agent can infer the appropriate context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.1.0- Changed
render_context_card1 field changed- added
Input schema / properties / expandedAdded value: +{ + "description": "render every AGENTS.md section open (default: collapsed)", + "type": "boolean" +}
3 tool updates
v0.6.2- Changed
forget1 field changed- added
Input schema / properties / id / descriptionAdded value: +"The exact id of the fact to remove. Reports whether a fact was actually removed."
- Changed
recall1 field changed- added
Input schema / properties / id / descriptionAdded value: +"The exact id a previous remember call used. Returns the stored text, or a \"no memory for <id>\" message if nothing matches."
- Changed
remember2 fields changed- added
Input schema / properties / id / descriptionAdded value: +"A stable key you choose for this fact — pass the same id later to recall or forget it. Exact match, case-sensitive, any string; keep it short and meaningful (e.g. \"deploy-target\", \"db-url\"). Reusing an id updates that fact rather than adding a second one." - added
Input schema / properties / text / descriptionAdded value: +"The fact itself, as plain prose. Stored verbatim and returned as-is by recall."
9 tool updates
v0.5.1- First observed
author_agents_md - First observed
forget - First observed
list_agents_md_sections - First observed
list_context_sources - First observed
read_agents_md - First observed
recall - First observed
remember - First observed
render_context_card - First observed
whoami
TDQS
Scored across 9 tools
Most tools are clearly separated by domain: fact memory, AGENTS.md, and context discovery/identity. A few pairs like recall vs read_agents_md and list_agents_md_sections vs list_context_sources could be momentarily confused, but their descriptions clarify distinct scopes.
Names are all lowercase snake_case and mostly follow a verb-object pattern, which is readable and predictable. The memory verbs remember/recall/forget drop the object, and whoami is a special case, creating minor but not confusing inconsistencies.
Nine tools is an appropriate size for this server's scope, covering fact memory, AGENTS.md operations, and context discovery without redundant helpers or bloat. Each tool earns its place.
The set covers the main workflows: fact create/read/delete, AGENTS.md read/section listing/drafting, and context discovery/identity. It lacks direct fact enumeration and a way to persist authored AGENTS.md, but render_context_card can surface memory and file writing may be intentionally outside the server's scope.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Persistent project context — Rust-native MCP server. IANA-registered .faf format.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Persistent memory for AI agents — log and recall conversation context over MCP.
Related MCP Servers
- AlicenseAqualityAmaintenance.FAF (Foundational AI-context Format) with 50+ tools - Only Persistent project context that integrates seamlessly with Claude Desktop workflows. Officially merged (#2759) Anthropic MCP server.1223923MIT
- AlicenseNot gradedqualityDmaintenanceAn agent-capable MCP server with terminal access, filesystem control, and persistent memory. It includes sandboxing, access control, activity logging, and a file-backed memory store for context across conversations.MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that provides controlled read/write tools for managing local-first research memory in an Obsidian vault, enabling AI agents to maintain project context across sessions.141MIT
- AlicenseAqualityBmaintenanceMCP server for managing project memory in AGENTS.md. Allows agents to record and remove durable facts using save/forget tools.21051MIT

