Skip to main content
Glama

mcp-context-card

npm CI license: MIT mcp-context-card MCP server

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

the business card front, light theme: name, title, one-liner

the business card front, dark theme

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 card

context — the project's AGENTS.md, served whole or one section at a time.

the back's Context tab — AGENTS.md, section nav, read_agents_md

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

the back's Memory tab — real, tagged, verified facts

identity — what this server is, from its own .fafa (agent.fafa, else .well-known/fafa).

the back's About tab — the identity in full

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 AGENTS.md — you don't have one

author_agents_md drafts one from your repo's real facts

Improve an AGENTS.md — you have one, make it the best it can be

the same tool, automatically — drop in a project.faf and it upgrades to BEST: goal, who it's for, why

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.md served section‑by‑section, remember / recall / forget memory that survives a restart, and a whoami identity — 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_md wraps it for the facts layer; adds a BEST layer of its own from project.faf when 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 .fafa says it runs) and a one-liner (the start of its description).

  • Back (Flip): tabs for About (the identity in full), Skills (when the .fafa lists capabilities), Context (AGENTS.md), Memory and Discovery. Long content scrolls inside the card.

  • Landscape or portrait: the ▭ ▯ button switches the view; --portrait / ?layout=portrait sets 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=%230066cc

In 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 card

At 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:

  1. Server Card _meta (SEP‑2127) — one reverse‑DNS‑namespaced key per concern, readable in‑band as an MCP resource and at GET /mcp/server-card (the 1.x /.well-known/mcp/server-card still answers).

  2. ai-catalog.json — the Server Card plus sibling entries keyed by media type, at GET /.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

author_agents_md

draft an AGENTS.md — BETTER from the repo's facts (via agents-md-facts), BEST when a project.faf exists — ready to drop in

read_agents_md

return the project's AGENTS.md — whole, or one section by heading

list_agents_md_sections

the headings, so a client pulls one section instead of the whole file

remember

write a fact that will still be there next session

recall

read a fact stored in a previous session

forget

drop or correct a stale fact

whoami

this server's name, vendor, version, status, license

list_context_sources

what this project publishes, in what media types, via which surface

render_context_card

the whole card as one self‑contained HTML page (also GET /card); hosts that support MCP Apps show it inline

save_context_card

write the card to context-card.html in the project and open it in your browser; returns the card as Markdown plus a link to the full version

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:

  1. Context — list the AGENTS.md sections, then pull just ## Test.

  2. Memory — remember() a fact, stop the server process, start a new one, recall() the same fact. Only the file carries it across.

  3. Identity — whoami(), and the Server Card _meta block read back from a live client.

  4. Discovery — list_context_sources(), then the same server over stateless HTTP with its .well-known routes and GET /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

src/server.ts

the ten tools + the Server Card and card resources

src/agents-md.ts

reads and section‑splits AGENTS.md

src/author.ts

author_agents_md — BETTER via agents-md-facts, BEST when project.faf exists

src/md.ts

a minimal dependency‑free Markdown → HTML renderer

src/render-card.ts

the card — identity + AGENTS.md + memory + discovery, as one HTML page

src/memory.ts

file‑backed remember / recall / forget

src/identity.ts

whoami (.fafa → package.json fallback) + the _meta block

src/server-card.ts

the MCP Server Card (SEP-2127, schema v1)

src/catalog-gen.ts

writes ai-catalog.json: the Server Card + its sibling entries

src/transport/http.ts

the stateless Streamable HTTP app (Hono)

src/transport/guard.ts

Origin and Host checks (DNS-rebinding protection)

src/conformance/discovery.ts

a portable Server Card / AI Catalog / transport checker

src/bin.ts

the entry point — stdio · --http · card · --help · --version

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 tools
author_agents_mdDraft an AGENTS.mdA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FactA
DestructiveIdempotent

Remove a fact by id — to correct or drop something stale. A missing id is reported, not an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe exact id of the fact to remove. Reports whether a fact was actually removed.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 SectionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 SourcesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.mdA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoA heading to return just that section (case-insensitive, prefix match). Omit for the whole file.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 FactA
Read-onlyIdempotent

Retrieve a fact stored in a previous session by id. Exact lookup — not fuzzy or substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe exact id a previous remember call used. Returns the stored text, or a "no memory for <id>" message if nothing matches.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FactA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesA 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.
textYesThe fact itself, as plain prose. Stored verbatim and returned as-is by recall.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 CardA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
themeNodefault: auto
accentNoCSS hex colour, e.g. #FF702D (default: the AAIF palette)
expandedNorender every AGENTS.md section open (default: collapsed)

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 CardA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
openNoopen the saved card in the person's browser when the server runs locally (default: true)
themeNodefault: auto
accentNoCSS hex colour, e.g. #FF702D (default: the AAIF palette)
detailNothe Markdown reply: tldr (default) shows five facts, each cut short; full shows every fact whole. The saved file always has everything.
expandedNorender every AGENTS.md section open (default: collapsed)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 IA
Read-onlyIdempotent

This server's own identity — name, vendor, version, status, license — from its .fafa card.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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. 1 tool updatev1.3.0
    • Addedsave_context_card
  2. 1 tool updatev1.1.0
    • Changedrender_context_card1 field changed
      • addedInput schema / properties / expanded
        Added value: +{
        +  "description": "render every AGENTS.md section open (default: collapsed)",
        +  "type": "boolean"
        +}
  3. 3 tool updatesv0.6.2
    • Changedforget1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The exact id of the fact to remove. Reports whether a fact was actually removed."
    • Changedrecall1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The exact id a previous remember call used. Returns the stored text, or a \"no memory for <id>\" message if nothing matches."
    • Changedremember2 fields changed
      • addedInput schema / properties / id / description
        Added 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."
      • addedInput schema / properties / text / description
        Added value: +"The fact itself, as plain prose. Stored verbatim and returned as-is by recall."
  4. 9 tool updatesv0.5.1
    • First observedauthor_agents_md
    • First observedforget
    • First observedlist_agents_md_sections
    • First observedlist_context_sources
    • First observedread_agents_md
    • First observedrecall
    • First observedremember
    • First observedrender_context_card
    • First observedwhoami

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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