mcp-context-card
mcp-context-card gives an MCP host project context, persistent memory, identity, and a shareable context card.
Read the project's
AGENTS.mdwhole or by section (read_agents_md,list_agents_md_sections).Draft an
AGENTS.mdfrom real repo facts, upgraded withproject.faf(author_agents_md).Persist, retrieve, and remove facts across sessions (
remember,recall,forget).Report the server's own identity (
whoami).List what context the project publishes and how to discover it (
list_context_sources).Render the full card as self-contained HTML (
render_context_card; alsoGET /card).Save the card to
context-card.html, open it locally, and return Markdown plus a link (save_context_card).Supports stdio/HTTP, Server Card
_meta,ai-catalog.json, MCP Apps inline rendering, and composes alongside other MCP servers.
Click on "Deploy 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 |
|
|
See your own project's business card — run this in its folder. It writes
context-card.html and opens it in your browser. The front is the card: name,
title, one-liner. Flip it for the back: About, Context, Memory, Discovery.
npx mcp-context-card cardcontext — 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 .fafa (agent.fafa, else .well-known/fafa).

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.
Ten 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, and agent.fafa or .well-known/fafa), plus the
context-card.html it saves on request — no general file access, no shell,
no search.
The card
The screenshot at the top of this page is exactly this: the same sources rendered as a business card in one self‑contained HTML page. The view for people: read it, screenshot it, drop it in a PR, put it on a status page.
Front: the name, a title (what it is and its version: "MCP server", "A2A agent", from where the project's
.fafasays it runs) and a one-liner (the start of its description).Back (Flip): tabs for About (the identity in full), Skills (when the
.fafalists capabilities), Context (AGENTS.md), Memory and Discovery. Long content scrolls inside the card.Landscape or portrait: the ▭ ▯ button switches the view;
--portrait/?layout=portraitsets it.Light or dark card: the card's colour is its own, like a printed card.
--theme/?theme=sets it (default: follow your OS), and ◐ switches it. The page around it always follows your OS.
Flip, tabs and the view switch are plain CSS, so they work with scripts off.
The one small inline script adds Expand all, opens a #section link on the
back, and opens every section for printing. --expanded / ?expand=all
renders both faces flat, every section open, for a screenshot or print.
npx mcp-context-card card # at a terminal: writes context-card.html and opens it
npx mcp-context-card card --portrait # the tall view
npx mcp-context-card card --expanded # both faces flat, 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?layout=portrait&theme=light&accent=%230066ccIn a chat, hosts that support MCP Apps
show the card inline when render_context_card runs; the model gets a short
summary instead of the page. Everywhere else, save_context_card writes
context-card.html into the project, opens it in your browser when the
server runs locally, and replies with the card as Markdown (identity, the
AGENTS.md sections, memory, discovery), a link to the full card, and its
address to copy. The Markdown is a tl;dr by default: five facts, each cut to
its first sentence as stored, so it stays small however much a project
remembers. detail: "full" lists every fact whole. The server's
instructions tell the model to show that rather than paste the HTML into
the chat.
Light, dark, or auto. The colour is the owner's: set it in the project's
.fafa (metadata.cards.accent: "#0066cc"), or pass any hex with --accent
or ?accent. With none, the card is drawn in ink, black or white; no colour
is guessed.
This repo's own card, live: auto ·
light ·
dark
(in the AAIF orange its .fafa declares).
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
goose, Claude Desktop, Cursor, or any stdio host:
{
"mcpServers": {
"context-card": {
"command": "npx",
"args": ["-y", "mcp-context-card"]
}
}
}No path to configure: the server asks the host which project you're in (MCP
roots — goose sends its session's working directory), then falls back to the
directory it was started in if that has an AGENTS.md. list_context_sources
reports which project it picked and how. To pin one project instead, set
"env": { "MCP_CONTEXT_CARD_ROOT": "/abs/path/to/your/project" }; that always
wins. Identity is optional. Over HTTP instead:
PORT=8080 npx mcp-context-card. Requires Node ≥22.
HTTP mode is local by default, as the MCP transports spec asks: it binds
127.0.0.1, refuses foreign browser origins with 403, and refuses DNS names
rebound to this machine. HOST=0.0.0.0 exposes it (a container or hosted
deploy). There is no authentication or rate limiting, so put an exposed server
behind your own.
Memory is session data: an exposed server shows only its count on /card, and
never serves or lists project.fafm, unless you set
MCP_CONTEXT_CARD_PUBLISH_MEMORY=1. Details:
docs/TRANSPORT.md.
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.
Your identifiers
The AI Catalog names each entry urn:air:{domain}:{namespace}:{name}, and
the domain is yours. It comes from your project's .fafa: run
npx faf-cli card init (or --domain example.com), and it writes
agent.id: urn:air:example.com:agent:<short-name>. Your catalog then publishes
urn:air:example.com:context:<short-name> and so on, with no code to change.
This repo's own .fafa says faf.one; that's our example, and yours says yours.
With no .fafa, no domain is invented: the served catalog uses the host it's
served from (localhost when you run it locally), and the static
.well-known/ai-catalog.json uses plain <short-name>:<namespace> IDs.
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 /mcp/server-card(the 1.x/.well-known/mcp/server-cardstill answers).ai-catalog.json— the Server Card plus 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 |
| write the card to |
Seven tools only read. remember and forget write the memory file, and
save_context_card writes context-card.html, so those three are marked
destructive and a host can ask before running them. Every tool carries a
title and MCP tool annotations.
The demo
npm run demo walks through context, memory, identity and discovery, live,
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.
210 tests on Linux, macOS, and Windows, coverage‑gated in CI.
npm run wjttc runs the WJTTC certification suite (seven tiers, from protocol
and Server Card conformance to stdio/HTTP parity and the shipped package). 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, and another checks
every tool's title and behaviour hints against what it actually does.
src/conformance/discovery.ts checks any server's Server Card, AI Catalog and
transport security against the specs, one MUST or SHOULD at a time.
Layout
Path | What |
| the ten tools + the Server Card and card resources |
| reads and section‑splits |
|
|
| a minimal dependency‑free Markdown → HTML renderer |
| the card — identity + |
| file‑backed |
|
|
| the MCP Server Card (SEP-2127, schema v1) |
| writes |
| the stateless Streamable HTTP app (Hono) |
| Origin and Host checks (DNS-rebinding protection) |
| a portable Server Card / AI Catalog / transport checker |
| 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
10 toolsauthor_agents_mdDraft an AGENTS.mdARead-onlyIdempotent
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?
Annotations already declare readOnlyHint=true, idempotentHint=true and a closed world, and the description reinforces them with 'Does not write a file' rather than contradicting them. It adds real behavioral context beyond the annotations by disclosing the content provenance (repo facts, 'nothing invented') and the two-block output shape when a project.faf is 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?
It is a single front-loaded sentence with the verb and resource leading, and every clause carries information (provenance, quality tiers, no-write guarantee). The stacked parentheticals and BETTER/BEST framing make it denser to parse than it needs to be, costing it the top mark.
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 draft generator with no output schema or annotations about returns, the description supplies what the agent needs: the source of content, the no-write guarantee, and the file's managed-block structure. Details like draft length or how an existing AGENTS.md is handled are left unstated.
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 takes zero parameters, so the baseline is 4 and there is no parameter semantics for the description to compensate for. It correctly omits any argument discussion rather than inventing options.
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 clear verb+resource: 'Author an AGENTS.md for this project and return the draft,' plus the key scoping fact that it 'Does not write a file,' which distinguishes it from save/write siblings. It never names the read/list siblings directly, so an agent must infer the boundary from the verb alone rather than being told explicitly.
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?
It gives a usable precondition ('BEST when a project.faf exists') and a fallback path when it doesn't, which is genuine conditional guidance. However, it frames these as output-quality tiers (BETTER/BEST) rather than telling the agent when to choose this tool over alternatives like read_agents_md or list_agents_md_sections, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetForget a FactADestructiveIdempotent
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?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavioral information not in the annotations: a missing id is reported rather than treated as an error, which tells the agent how to interpret a failed lookup.
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 clauses with the action front-loaded and the error-handling note second; every word earns its place and nothing is padded.
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 delete with no output schema, the description plus schema cover the essentials: what is removed, that a miss is reported, and that it is destructive/idempotent. It could say slightly more about what the report contains, but nothing needed to call it correctly 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?
Schema coverage is 100%, so the single 'id' parameter and its role are fully documented in the schema, establishing a baseline of 3. 'by id' in the description adds no syntax or format detail beyond 'the exact id of the fact to remove' already present 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?
States a specific verb and resource ('Remove a fact by id') plus the intent behind it, which is enough to separate it from siblings like remember and recall without opening either schema. It stops short of naming those alternatives explicitly, so it is clear but not maximally differentiated.
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 clause 'to correct or drop something stale' gives a concrete when-to-use context (correction / stale data removal). There is no explicit when-not or named alternative, but for a single-purpose delete tool the usage trigger is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agents_md_sectionsList AGENTS.md SectionsARead-onlyIdempotent
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?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is fully covered by structured fields. The description's added value is the context-cost rationale, which is useful but modest, and it says nothing about the shape of what is returned.
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?
A single, front-loaded sentence: verb/resource first, rationale second. No waste and nothing buried.
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 read tool with full annotation coverage and no output schema, the description supplies everything needed to select it. The only gap is that it does not hint at the return payload (heading list structure), which is a minor omission.
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 takes zero parameters, so per the rubric the baseline is 4; there is nothing for the description to disambiguate.
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 a specific verb (List) and resource (headings in this project's AGENTS.md), so an agent can tell this apart from read_agents_md (full content) or author_agents_md (write). The contrasting sibling is only implied via 'instead of the whole file' rather than named, which keeps it just short of a 5.
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 trailing clause gives a clear situational rationale for the tool: use it to find a section so you can fetch just that part, saving context. It stops short of explicit when-not guidance or naming the follow-up tool (read_agents_md) directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_context_sourcesList Context SourcesARead-onlyIdempotent
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?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds that this is a broad discovery probe returning content categories and discovery surfaces, but says nothing about response shape, ordering or what a cold client should do with the result.
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 zero filler, and the primary purpose is front-loaded before the audience qualifier. Nothing is repeated from the title or annotations.
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, read-only discovery tool with annotations covering safety, the description gives enough to call it: it names the categories and surfaces returned. With no output schema, a fuller sketch of the returned structure would have pushed this higher.
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 takes zero parameters, so the schema carries no semantics to compensate for; the baseline of 4 applies. The description's enumeration of content types is about return content, not input, so it neither helps nor hurts here.
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 a specific discovery action and enumerates the resource categories it covers (AGENTS.md, memory, identity) plus the dimensions it reports (media types, discovery surface). It implicitly reads as the umbrella lister over siblings like read_agents_md, list_agents_md_sections and whoami, but never names them, so it falls short of a 5.
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?
"For a client connecting cold" gives a genuine usage context (session-start discovery), which is more than nothing. However, it offers no explicit alternatives or exclusions, and with near-overlapping siblings (list_agents_md_sections, read_agents_md, whoami) an agent could still pick the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_agents_mdRead AGENTS.mdARead-onlyIdempotent
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?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds only the justification for the tool's existence and the output granularity; it says nothing about behavior when a heading doesn't match, since the case-insensitive prefix match detail lives in the schema.
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 primary action and output modes. The trailing clause about what a client would otherwise have to look for is rationale rather than instruction, so it is mildly expendable but not harmful.
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-required-parameter read tool with annotations covering safety and no output schema, the description sufficiently conveys what is returned (whole file or a named section). Missing only edge-case behavior when no section matches, which is a minor gap.
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 single parameter is fully documented there, including the case-insensitive prefix-match semantics. The description only restates the same whole-file-vs-section choice, adding no syntax or format detail beyond the schema. Baseline 3 is appropriate.
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 a specific verb and resource ('Return this project's AGENTS.md') plus the two output modes (whole file or one section by heading). This clearly separates it from the sibling write tool author_agents_md and from list_agents_md_sections, which only lists 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 whole file, or one section by heading' implies when to use the section parameter, but the description gives no explicit guidance such as 'use list_agents_md_sections first to discover headings' or any exclusion. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallRecall a FactARead-onlyIdempotent
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?
Annotations already cover read-only, idempotent, and closed-world behavior. The description adds meaningful context beyond that: it retrieves facts stored in a previous session and performs exact matching only — a behavioral constraint that prevents an agent from expecting fuzzy results. It doesn't discuss auth or rate limits, but none are implied.
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, front-loaded with the core action and immediately followed by the key constraint. Every word earns its place; 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 single-parameter read tool, the description, schema, and annotations together cover all an agent needs: what it does, how to call it, the exact-match constraint, the return behavior (via schema), and the safety profile (via annotations). 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?
Schema coverage is 100%, and the schema already documents that the id must be the exact id from a previous remember call, including the possible 'no memory for <id>' response. The description's 'by id' and 'exact lookup' reinforce but do not add syntax or format details beyond what the schema provides, so the baseline 3 is appropriate.
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 a specific verb (Retrieve) and resource (a fact stored in a previous session), scoped by id. The phrase 'Exact lookup — not fuzzy or substring' clearly distinguishes it from broader search or fuzzy-match operations, and the verb contrasts naturally with siblings like remember and forget.
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?
Provides clear context: use when you have an id from a previous remember call, and explicitly excludes fuzzy/substring lookups. However, it does not name alternative tools or describe when to prefer remember/forget/list operations, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberRemember a FactADestructiveIdempotent
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?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description earns credit by explaining why: reusing an id overwrites that fact's text in place while a new id appends, and storage is a .fafm file rather than memory. It also discloses the side effect of tagging facts verification_status: unverified, which is not derivable from the schema or annotations.
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?
Three tight clauses, no padding, with the most decision-relevant information (persistence across sessions, overwrite-vs-append) front-loaded. Every sentence carries information an agent can act on.
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 two-parameter, no-output-schema write tool with full annotation coverage, the description supplies storage location, overwrite semantics, and the unverified flag — enough to call it correctly. Return behavior is left unstated, but the tool plausibly returns nothing meaningful, so the gap is minor.
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 both id and text are already fully documented in the schema, including the id-reuse rule stated there as well. The description adds no new parameter-level detail (syntax, format, limits) beyond what the schema provides, so the baseline of 3 applies.
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 a specific verb and resource ('Persist a fact') plus the crucial scope distinction that it survives the session boundary via a .fafm file rather than memory. The id-reuse vs append semantics further pin down behavior. It does not name or contrast the related recall/forget siblings, so it falls short of the top mark.
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?
Implies its place — persisting facts across sessions — but gives no explicit when-to-use vs when-not, and never references the sibling tools (recall, forget, save_context_card) that an agent must choose between. The id-reuse note is behavioral, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_context_cardRender Context CardARead-onlyIdempotent
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?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful non-schema context: the default collapsed rendering of AGENTS.md sections and the parallel HTTP endpoint with ?expand=all.
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 dense but front-loaded sentences; the core purpose leads and the behavioral detail follows. The em-dash content list is efficient, though the second sentence packs two unrelated facts (collapse default, HTTP route) together.
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 no output schema, the description correctly characterizes the return value as one self-contained HTML page. Nothing critical is missing for a zero-required-parameter, read-only render tool, though it could note whether the response is the HTML itself or a reference to it.
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 all three parameters (theme, accent, expanded) are already documented with defaults and the accent hex format. The description only restates the expanded flag semantics, adding no new meaning beyond the schema. Baseline 3 is correct.
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 a specific verb (render) and resource (the context card) and enumerates the content scope: identity, AGENTS.md, memory, discovery, output format (self-contained HTML page). An agent can distinguish this from save_context_card or read_agents_md without opening a schema.
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?
Usage is implied rather than stated: 'a person can read or screenshot' signals a human-facing, presentation use case, and it notes the equivalent HTTP route (GET /card). However, there is no explicit when-to-use, when-not, or named alternative among siblings (e.g. save_context_card vs render).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_context_cardSave Context CardADestructiveIdempotent
Write the context card to context-card.html in the project and, when this server runs locally, open it in the person's browser. Returns the card as Markdown (identity, AGENTS.md sections, memory, discovery) plus a clickable link to the saved file. Use this instead of pasting render_context_card's HTML into a chat that can't display it. Replaces any earlier context-card.html.
| Name | Required | Description | Default |
|---|---|---|---|
| open | No | open the saved card in the person's browser when the server runs locally (default: true) | |
| theme | No | default: auto | |
| accent | No | CSS hex colour, e.g. #FF702D (default: the AAIF palette) | |
| detail | No | the Markdown reply: tldr (default) shows five facts, each cut short; full shows every fact whole. The saved file always has everything. | |
| expanded | No | render every AGENTS.md section open (default: collapsed) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true; the description adds the concrete consequence ('Replaces any earlier context-card.html') and the browser-open side effect, which the boolean hints cannot convey. It does not mention failure modes or permission requirements, so it stops short of full coverage.
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?
Four sentences, front-loaded with the action and artifact, with no filler. The return-value sentence and the alternative-routing sentence are both load-bearing; slightly dense but every clause earns its place.
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 no output schema, the description carries the return contract itself ('the card as Markdown ... plus a clickable link'), lists the returned content sections, and discloses the overwrite and browser-open side effects. Nothing an agent needs to call it correctly 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?
Schema description coverage is 100%, so the schema already documents all five optional parameters (open, theme, accent, detail, expanded), including defaults and enum values. The description adds nothing parameter-specific, so the baseline 3 applies.
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 a specific verb and artifact: 'Write the context card to context-card.html in the project.' It also names the output (Markdown plus a link) and contrasts itself with the sibling render_context_card, so an agent can distinguish the two without opening either schema.
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?
'Use this instead of pasting render_context_card's HTML into a chat that can't display it' names the alternative tool and the condition that selects this one. The local-vs-remote behavior of the browser-open step is also stated, so the routing decision and the execution context are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiWho Am IARead-onlyIdempotent
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?
Annotations already cover the safety profile (readOnly, idempotent, not open-world), and the description adds genuinely useful context beyond them: the contents returned and the source of truth (its .fafa card), which aligns with openWorldHint=false. It is silent on failure behavior when no card exists, so it stops short of full 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?
A single front-loaded sentence with the identity statement first and the field/source detail immediately after. Every clause earns its place with no 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?
With no parameters and no output schema, the description usefully compensates by listing the fields that come back. It is nearly complete; only edge behavior (missing/invalid .fafa card) is unaddressed, which is a small gap for an identity probe.
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 takes zero parameters, so the schema baseline of 4 applies. Nothing in the description is needed to explain inputs, and none is misdescribed.
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 the specific resource (the server's OWN identity, not the caller's) and enumerates the returned fields (name, vendor, version, status, license). This disambiguates it well against siblings like list_context_sources or read_agents_md, though it never names an alternative directly.
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?
Usage is only implied: an agent infers it should call this when it needs to know what server it is talking to. There is no explicit when-to-use, when-not-to-use, or named alternative among the sibling tools, but for a trivial zero-argument probe the omission is minor.
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.3.0- Added
save_context_card
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 10 tools
Most tools target clearly distinct resources and actions: AGENTS.md listing/reading/authoring, memory create/read/delete, identity, discovery, and card rendering/saving. The only mild overlap is between render_context_card and save_context_card, and between whoami and list_context_sources, but the descriptions distinguish them well.
The set is mostly consistent verb_noun snake_case (list_agents_md_sections, read_agents_md, author_agents_md, list_context_sources, render_context_card, save_context_card). The memory tools use simple verbs (remember, recall, forget) and whoami is a special-case command, which are minor deviations but still readable.
Ten tools is well-scoped for a context-card server covering AGENTS.md, memory, identity, discovery, and rendering. Each tool earns its place and there is no evident bloat.
Core lifecycle operations are present: AGENTS.md can be listed, read, and drafted; memory can be created, recalled, and forgotten; identity, discovery, and card rendering/saving are covered. Minor gaps exist, such as no explicit listing of all stored memory facts and no direct write of AGENTS.md, but agents can work around these with known IDs or external file writes.
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.
Hosted MCP server and Agent Skills for specs, engineering threads, and project memory.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Related MCP Servers
- AlicenseAqualityBmaintenance.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.14554 npm23MIT
- 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.11 npm1MIT
- AlicenseAqualityAmaintenanceMCP server for managing project memory in AGENTS.md. Allows agents to record and remove durable facts using save/forget tools.3497 npm1MIT

