mcp-context-card 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/fafa +1 -1
- package/CHANGELOG.md +35 -0
- package/README.md +3 -3
- package/dist/bin.d.ts +1 -1
- package/dist/catalog-gen.js +3 -2
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/faf/parse-fafa.js +1 -0
- package/dist/faf/types.d.ts +2 -0
- package/dist/identity.d.ts +6 -1
- package/dist/identity.js +21 -7
- package/dist/render-card.js +2 -2
- package/dist/transport/http.js +6 -2
- package/docs/MECHANISMS.md +1 -1
- package/docs/card-dark.html +1 -1
- package/docs/card-light.html +1 -1
- package/docs/card.html +1 -1
- package/docs/img/card-dark.png +0 -0
- package/docs/img/card-identity.png +0 -0
- package/docs/img/card-light.png +0 -0
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/project.faf +18 -0
- package/server.json +5 -4
package/.well-known/fafa
CHANGED
|
@@ -9,7 +9,7 @@ agent:
|
|
|
9
9
|
name: "mcp-context-card"
|
|
10
10
|
displayName: "mcp-context-card"
|
|
11
11
|
vendor: "io.github.Wolfe-Jam"
|
|
12
|
-
version: "1.
|
|
12
|
+
version: "1.4.0"
|
|
13
13
|
description: >-
|
|
14
14
|
The essential MCP components for a project's context (AGENTS.md),
|
|
15
15
|
cross-session memory, and identity — a base MCP on its own, or a
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project. Adheres to [Semantic Versioning](https://semver.org).
|
|
4
4
|
|
|
5
|
+
## 1.4.0
|
|
6
|
+
|
|
7
|
+
The card reads the `.fafa` that `faf card init` writes, and shows the agent's ID.
|
|
8
|
+
|
|
9
|
+
- **Identity reads `agent.fafa`.** `faf card init` writes the agent's `.fafa`
|
|
10
|
+
to `./agent.fafa`; the card, `whoami`, the AI Catalog and the served
|
|
11
|
+
`/.well-known/fafa` now read it, and fall back to `.well-known/fafa` as
|
|
12
|
+
before. With both, `agent.fafa` wins.
|
|
13
|
+
- The README's identity line names the `.fafa`, not "its own Server Card"
|
|
14
|
+
(the MCP Server Card is the `_meta` block).
|
|
15
|
+
- **The agent ID shows.** `agent.id` (the `urn:air:…` that `faf card init`
|
|
16
|
+
writes) is read and shown in the card's Discovery section, the Markdown
|
|
17
|
+
card and `whoami`. No `id`, no line.
|
|
18
|
+
|
|
19
|
+
No API change. 140 tests, all green.
|
|
20
|
+
|
|
21
|
+
## 1.3.1
|
|
22
|
+
|
|
23
|
+
The registry listing catches up with 1.3.0.
|
|
24
|
+
|
|
25
|
+
- **`MCP_CONTEXT_CARD_ROOT` is described as it works now.** The listing
|
|
26
|
+
still said that, unset, the server reads its own bundled copies. Since
|
|
27
|
+
1.3.0 it follows the host's MCP roots, then the start directory if it has
|
|
28
|
+
an `AGENTS.md`. Hosts that install from `server.json` show this text when
|
|
29
|
+
you add the server.
|
|
30
|
+
- **A display name and a website.** `title` is "MCP Context Card" (it was
|
|
31
|
+
the package name), and `websiteUrl` points at the README.
|
|
32
|
+
- **`project.faf` scores 100% on the always-33 scorer** (it was 56% on
|
|
33
|
+
faf-cli 8): the enterprise slots a single npm package doesn't use are
|
|
34
|
+
marked `slotignored`, `package_manager` is `npm`, and the build, test, dev
|
|
35
|
+
and start commands are listed. CI checks it with faf-cli 8.1.0 (it was
|
|
36
|
+
pinned to 7.10.1, which counted only 21 slots).
|
|
37
|
+
|
|
38
|
+
No code change.
|
|
39
|
+
|
|
5
40
|
## 1.3.0
|
|
6
41
|
|
|
7
42
|
Your project, with nothing to configure.
|
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ npx mcp-context-card card
|
|
|
28
28
|
|
|
29
29
|

|
|
30
30
|
|
|
31
|
-
**identity** — what this server is, from its own
|
|
31
|
+
**identity** — what this server is, from its own `.fafa` (`agent.fafa`, else `.well-known/fafa`).
|
|
32
32
|
|
|
33
33
|

|
|
34
34
|
|
|
@@ -70,7 +70,7 @@ It composes:
|
|
|
70
70
|
|
|
71
71
|
Vendor-free — context is plain Markdown (`AGENTS.md`); the memory and
|
|
72
72
|
identity formats are swappable examples. It reads and writes only its own
|
|
73
|
-
three files (`AGENTS.md`, `project.fafm`, `.well-known/fafa`), plus the
|
|
73
|
+
three files (`AGENTS.md`, `project.fafm`, and `agent.fafa` or `.well-known/fafa`), plus the
|
|
74
74
|
`context-card.html` it saves on request — no general file access, no shell,
|
|
75
75
|
no search.
|
|
76
76
|
|
|
@@ -235,7 +235,7 @@ over both transports:
|
|
|
235
235
|
4. **Discovery** — `list_context_sources()`, then the same server over stateless
|
|
236
236
|
HTTP with its `.well-known` routes and `GET /card`.
|
|
237
237
|
|
|
238
|
-
|
|
238
|
+
140 tests on Linux, macOS, and Windows, coverage‑gated in CI. Two spawn a real
|
|
239
239
|
child process and check a remembered fact survives the restart — one against
|
|
240
240
|
an existing `project.fafm`, one starting from a project that has never had
|
|
241
241
|
one; another checks the stdio and HTTP tool surfaces match, and another checks
|
package/dist/bin.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface Launch {
|
|
|
8
8
|
root: string;
|
|
9
9
|
}
|
|
10
10
|
/** what a bare `--help` / `help` prints. */
|
|
11
|
-
export declare const HELP = "mcp-context-card 1.
|
|
11
|
+
export declare const HELP = "mcp-context-card 1.4.0\nServe a project's context (AGENTS.md), memory, and identity over MCP.\n\nUSAGE\n mcp-context-card stdio MCP server \u2014 what an MCP host spawns (default)\n mcp-context-card --http stateless Streamable HTTP on PORT (default 3000)\n mcp-context-card --stdio force stdio even when PORT is set\n mcp-context-card card this dir's context card \u2014 opens it in your browser\n at a terminal; HTML to stdout when piped ( > f.html )\n --theme light|dark --accent #hex\n --expanded (all sections open) --stdout\n mcp-context-card --help this text\n mcp-context-card --version print version\n\nENV\n MCP_CONTEXT_CARD_ROOT read AGENTS.md / project.fafm / .well-known/ from here\n PORT if set, run HTTP instead of stdio\n\nA bare run is an stdio server: it waits for a host to speak JSON-RPC on stdin,\nso it looks idle at a terminal. Try `card` (opens your context in a browser) or `--http`.\nhttps://github.com/Wolfe-Jam/mcp-context-card\n";
|
|
12
12
|
/**
|
|
13
13
|
* Decide how to launch, from argv + env. Pure — so the mode matrix is unit
|
|
14
14
|
* tested without spawning a process.
|
package/dist/catalog-gen.js
CHANGED
|
@@ -13,12 +13,13 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
13
13
|
import { parseAgentsMd } from "./agents-md.js";
|
|
14
14
|
import { parseFafm } from "./faf/parse-fafm.js";
|
|
15
15
|
import { parseFafa } from "./faf/parse-fafa.js";
|
|
16
|
-
import { META_NS } from "./identity.js";
|
|
16
|
+
import { META_NS, fafaFile } from "./identity.js";
|
|
17
17
|
const iana = (t) => `https://www.iana.org/assignments/media-types/${t}`;
|
|
18
18
|
export function buildCatalog(root) {
|
|
19
19
|
const agents = parseAgentsMd(join(root, "AGENTS.md"));
|
|
20
20
|
const fafm = parseFafm(join(root, "project.fafm"));
|
|
21
|
-
const
|
|
21
|
+
const file = fafaFile(root);
|
|
22
|
+
const fafa = file ? parseFafa(file) : null;
|
|
22
23
|
const host = fafa?.name ?? "mcp-context-card";
|
|
23
24
|
return {
|
|
24
25
|
specVersion: "1.0",
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Server identity constants, in their own module so any file can import
|
|
2
2
|
* them without pulling in the whole server. */
|
|
3
3
|
export declare const NAME = "mcp-context-card";
|
|
4
|
-
export declare const VERSION = "1.
|
|
4
|
+
export declare const VERSION = "1.4.0";
|
|
5
5
|
export declare const SERVER_CARD_URI = "mcp-context-card://server-card";
|
|
6
6
|
/** MCP Apps (io.modelcontextprotocol/ui): the card as an inline UI resource.
|
|
7
7
|
* A host that supports MCP Apps fetches this resource and renders it in a
|
package/dist/constants.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Server identity constants, in their own module so any file can import
|
|
2
2
|
* them without pulling in the whole server. */
|
|
3
3
|
export const NAME = "mcp-context-card";
|
|
4
|
-
export const VERSION = "1.
|
|
4
|
+
export const VERSION = "1.4.0";
|
|
5
5
|
export const SERVER_CARD_URI = "mcp-context-card://server-card";
|
|
6
6
|
/** MCP Apps (io.modelcontextprotocol/ui): the card as an inline UI resource.
|
|
7
7
|
* A host that supports MCP Apps fetches this resource and renders it in a
|
package/dist/faf/parse-fafa.js
CHANGED
package/dist/faf/types.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface AgentIdentity {
|
|
|
26
26
|
version?: string;
|
|
27
27
|
name?: string;
|
|
28
28
|
displayName?: string;
|
|
29
|
+
/** `agent.id` — globally unique, e.g. `urn:air:example.com:agent:weather` (what `faf card init` writes). */
|
|
30
|
+
id?: string;
|
|
29
31
|
vendor?: string;
|
|
30
32
|
agentVersion?: string;
|
|
31
33
|
description?: string;
|
package/dist/identity.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { AgentIdentity } from "./faf/types.js";
|
|
2
2
|
/** The `_meta` key namespace — the publisher's, reverse-DNS. */
|
|
3
3
|
export declare const META_NS = "io.github.Wolfe-Jam.mcp-context-card";
|
|
4
|
+
/** Where a project keeps its `.fafa`, in the order they are read. */
|
|
5
|
+
export declare const FAFA_FILES: readonly ["agent.fafa", ".well-known/fafa"];
|
|
6
|
+
/** The project's `.fafa`: `agent.fafa` (what `faf card init` writes), else
|
|
7
|
+
* `.well-known/fafa`. null when there is neither. */
|
|
8
|
+
export declare function fafaFile(root: string): string | null;
|
|
4
9
|
export declare function identity(root: string): AgentIdentity | null;
|
|
5
10
|
/**
|
|
6
|
-
* The identity to show: the `.
|
|
11
|
+
* The identity to show: the `.fafa` ({@link fafaFile}) if present — richer and
|
|
7
12
|
* portable — else a thin one from `package.json` (the common project has no
|
|
8
13
|
* `.fafa`). null only when neither exists.
|
|
9
14
|
*/
|
package/dist/identity.js
CHANGED
|
@@ -1,20 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* identity — reads this server's own `.
|
|
3
|
-
*
|
|
2
|
+
* identity — reads this server's own `.fafa` (`agent.fafa`, where `faf card
|
|
3
|
+
* init` writes it, else `.well-known/fafa`) and reports it, and builds the
|
|
4
|
+
* `_meta` context block for the Server Card.
|
|
4
5
|
*
|
|
5
6
|
* The `_meta` block is three reverse-DNS-namespaced keys — one per concern
|
|
6
7
|
* (context, memory, identity) — each naming a source file, its media type,
|
|
7
8
|
* and (where one exists) its IANA anchor. Same shape a real client reading
|
|
8
9
|
* the Server Card would consume; see server.ts for where it's emitted.
|
|
9
10
|
*/
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
12
|
import { join } from "node:path";
|
|
12
13
|
import { parseFafa } from "./faf/parse-fafa.js";
|
|
13
14
|
/** The `_meta` key namespace — the publisher's, reverse-DNS. */
|
|
14
15
|
export const META_NS = "io.github.Wolfe-Jam.mcp-context-card";
|
|
15
16
|
const iana = (t) => `https://www.iana.org/assignments/media-types/${t}`;
|
|
17
|
+
/** Where a project keeps its `.fafa`, in the order they are read. */
|
|
18
|
+
export const FAFA_FILES = ["agent.fafa", ".well-known/fafa"];
|
|
19
|
+
/** The project's `.fafa`: `agent.fafa` (what `faf card init` writes), else
|
|
20
|
+
* `.well-known/fafa`. null when there is neither. */
|
|
21
|
+
export function fafaFile(root) {
|
|
22
|
+
for (const f of FAFA_FILES) {
|
|
23
|
+
const p = join(root, f);
|
|
24
|
+
if (existsSync(p))
|
|
25
|
+
return p;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
16
29
|
export function identity(root) {
|
|
17
|
-
|
|
30
|
+
const file = fafaFile(root);
|
|
31
|
+
return file ? parseFafa(file) : null;
|
|
18
32
|
}
|
|
19
33
|
/** Fall back to package.json — most projects have no .fafa, but they have this. */
|
|
20
34
|
function fromPackageJson(root) {
|
|
@@ -34,7 +48,7 @@ function fromPackageJson(root) {
|
|
|
34
48
|
}
|
|
35
49
|
}
|
|
36
50
|
/**
|
|
37
|
-
* The identity to show: the `.
|
|
51
|
+
* The identity to show: the `.fafa` ({@link fafaFile}) if present — richer and
|
|
38
52
|
* portable — else a thin one from `package.json` (the common project has no
|
|
39
53
|
* `.fafa`). null only when neither exists.
|
|
40
54
|
*/
|
|
@@ -45,7 +59,7 @@ export function resolveIdentity(root) {
|
|
|
45
59
|
export function whoami(root) {
|
|
46
60
|
const id = resolveIdentity(root);
|
|
47
61
|
if (!id)
|
|
48
|
-
return "(no .well-known/fafa or package.json found)";
|
|
62
|
+
return "(no agent.fafa, .well-known/fafa or package.json found)";
|
|
49
63
|
const parts = [
|
|
50
64
|
id.displayName ?? id.name ?? "(unnamed)",
|
|
51
65
|
id.agentVersion ? `v${id.agentVersion}` : null,
|
|
@@ -53,7 +67,7 @@ export function whoami(root) {
|
|
|
53
67
|
id.status ? `status: ${id.status}` : null,
|
|
54
68
|
id.license ? id.license : null,
|
|
55
69
|
].filter(Boolean);
|
|
56
|
-
return parts.join(" · ") + (id.description ? `\n${id.description}` : "");
|
|
70
|
+
return parts.join(" · ") + (id.description ? `\n${id.description}` : "") + (id.id ? `\n${id.id}` : "");
|
|
57
71
|
}
|
|
58
72
|
/**
|
|
59
73
|
* The `_meta` context block — one namespaced key per concern. The `context`
|
package/dist/render-card.js
CHANGED
|
@@ -195,7 +195,7 @@ export function renderCard(root, opts = {}) {
|
|
|
195
195
|
${memoryBody}
|
|
196
196
|
</section>
|
|
197
197
|
<section>
|
|
198
|
-
<p class="label">Discovery</p>
|
|
198
|
+
<p class="label">Discovery</p>${id?.id ? `\n <p class="fetch">Agent ID <code>${escapeHtml(id.id)}</code></p>` : ""}
|
|
199
199
|
<table class="disc"><thead><tr><th>concern</th><th>source</th><th>media type</th></tr></thead><tbody>${rows}</tbody></table>
|
|
200
200
|
<p class="fetch">A machine reads this over <b>MCP</b> from the
|
|
201
201
|
<code>${escapeHtml(SERVER_CARD_URI)}</code> resource; over <b>HTTP</b> also
|
|
@@ -294,6 +294,6 @@ export function renderCardText(root, opts = {}) {
|
|
|
294
294
|
.join("\n")}${rest ? `\n\n…and ${plural(rest, "more fact")}, in the full card` : ""}`
|
|
295
295
|
: "**Memory** · no facts yet. Ask your agent to remember something, and it lands here.");
|
|
296
296
|
const rows = Object.entries(meta).map(([k, v]) => `| ${k.slice(META_NS.length + 1)} | \`${v.source}\` | \`${v.mediaType}\` |`);
|
|
297
|
-
out.push(["**Discovery**", "| concern | source | media type |", "|---|---|---|", ...rows].join("\n"));
|
|
297
|
+
out.push(["**Discovery**", ...(id?.id ? [`Agent ID \`${id.id}\``, ""] : []), "| concern | source | media type |", "|---|---|---|", ...rows].join("\n"));
|
|
298
298
|
return out.join("\n\n");
|
|
299
299
|
}
|
package/dist/transport/http.js
CHANGED
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
* GET /.well-known/fafa — the agent identity card
|
|
17
17
|
*/
|
|
18
18
|
import { readFileSync } from "node:fs";
|
|
19
|
-
import { join } from "node:path";
|
|
20
19
|
import { Hono } from "hono";
|
|
21
20
|
import { cors } from "hono/cors";
|
|
22
21
|
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
23
22
|
import { buildCatalog } from "../catalog-gen.js";
|
|
23
|
+
import { fafaFile } from "../identity.js";
|
|
24
24
|
import { createServer, NAME, ROOT, VERSION, serverCard } from "../server.js";
|
|
25
25
|
import { renderCard, safeAccent } from "../render-card.js";
|
|
26
26
|
export function httpApp(root = ROOT) {
|
|
@@ -47,9 +47,13 @@ export function httpApp(root = ROOT) {
|
|
|
47
47
|
c.header("content-type", "application/ai-catalog+json");
|
|
48
48
|
return c.body(JSON.stringify(buildCatalog(root), null, 2));
|
|
49
49
|
});
|
|
50
|
+
// Served at the well-known path, read from agent.fafa or .well-known/fafa.
|
|
50
51
|
app.get("/.well-known/fafa", (c) => {
|
|
52
|
+
const file = fafaFile(root);
|
|
53
|
+
if (!file)
|
|
54
|
+
return c.notFound();
|
|
51
55
|
c.header("content-type", "application/vnd.fafa+yaml");
|
|
52
|
-
return c.body(readFileSync(
|
|
56
|
+
return c.body(readFileSync(file, "utf8"));
|
|
53
57
|
});
|
|
54
58
|
// ── The card — the view for people ──────────────────────────────────
|
|
55
59
|
app.get("/card", (c) => {
|
package/docs/MECHANISMS.md
CHANGED
package/docs/card-dark.html
CHANGED
|
@@ -100,7 +100,7 @@ details.ctx-section>.md{padding:0 0 16px}
|
|
|
100
100
|
<main class="card">
|
|
101
101
|
<div class="top">
|
|
102
102
|
<h1>mcp-context-card</h1>
|
|
103
|
-
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.
|
|
103
|
+
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.4.0</span><span class="pill accent">published</span><span class="pill">MIT</span></div>
|
|
104
104
|
</div>
|
|
105
105
|
<section>
|
|
106
106
|
<p class="label">Context — AGENTS.md</p>
|
package/docs/card-light.html
CHANGED
|
@@ -100,7 +100,7 @@ details.ctx-section>.md{padding:0 0 16px}
|
|
|
100
100
|
<main class="card">
|
|
101
101
|
<div class="top">
|
|
102
102
|
<h1>mcp-context-card</h1>
|
|
103
|
-
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.
|
|
103
|
+
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.4.0</span><span class="pill accent">published</span><span class="pill">MIT</span></div>
|
|
104
104
|
</div>
|
|
105
105
|
<section>
|
|
106
106
|
<p class="label">Context — AGENTS.md</p>
|
package/docs/card.html
CHANGED
|
@@ -100,7 +100,7 @@ details.ctx-section>.md{padding:0 0 16px}
|
|
|
100
100
|
<main class="card">
|
|
101
101
|
<div class="top">
|
|
102
102
|
<h1>mcp-context-card</h1>
|
|
103
|
-
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.
|
|
103
|
+
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.4.0</span><span class="pill accent">published</span><span class="pill">MIT</span></div>
|
|
104
104
|
</div>
|
|
105
105
|
<section>
|
|
106
106
|
<p class="label">Context — AGENTS.md</p>
|
package/docs/img/card-dark.png
CHANGED
|
Binary file
|
|
Binary file
|
package/docs/img/card-light.png
CHANGED
|
Binary file
|
package/docs/index.html
CHANGED
|
@@ -100,7 +100,7 @@ details.ctx-section>.md{padding:0 0 16px}
|
|
|
100
100
|
<main class="card">
|
|
101
101
|
<div class="top">
|
|
102
102
|
<h1>mcp-context-card</h1>
|
|
103
|
-
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.
|
|
103
|
+
<div class="pills"><span class="pill">io.github.Wolfe-Jam</span><span class="pill">v1.4.0</span><span class="pill accent">published</span><span class="pill">MIT</span></div>
|
|
104
104
|
</div>
|
|
105
105
|
<section>
|
|
106
106
|
<p class="label">Context — AGENTS.md</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-context-card",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"mcpName": "io.github.Wolfe-Jam/mcp-context-card",
|
|
5
5
|
"description": "The essential MCP components for a project's context (AGENTS.md), cross-session memory, and identity — a base MCP on its own, or a drop-in extension for any existing MCP server. Discoverable through the Server Card _meta block and ai-catalog.json sibling entries.",
|
|
6
6
|
"keywords": [
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"./package.json": "./package.json"
|
|
29
29
|
},
|
|
30
30
|
"engines": {
|
|
31
|
-
"node": ">=
|
|
31
|
+
"node": ">=22"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
34
|
"dist",
|
package/project.faf
CHANGED
|
@@ -17,6 +17,13 @@ stack:
|
|
|
17
17
|
connection: slotignored # no database
|
|
18
18
|
hosting: Docker / any Node host — stdio for local, stateless Streamable HTTP for remote
|
|
19
19
|
cicd: GitHub Actions — typecheck + build + test:coverage + demo on 3 OSes; catalog:check + card:check on Linux
|
|
20
|
+
monorepo_tool: slotignored
|
|
21
|
+
package_manager: npm
|
|
22
|
+
workspaces: slotignored
|
|
23
|
+
admin: slotignored
|
|
24
|
+
cache: slotignored
|
|
25
|
+
search: slotignored
|
|
26
|
+
storage: slotignored
|
|
20
27
|
tech_stack: [TypeScript, "@modelcontextprotocol/sdk", "agents-md-facts", hono, "@hono/node-server", yaml]
|
|
21
28
|
human_context:
|
|
22
29
|
who: MCP host and server implementers who want a project's AGENTS.md, memory, and identity available over MCP without inventing an ad-hoc shape for each.
|
|
@@ -26,3 +33,14 @@ human_context:
|
|
|
26
33
|
when: "2026-08-12"
|
|
27
34
|
how: TypeScript on the MCP SDK. Dual transport in src/bin.ts. The Server Card _meta block and ai-catalog.json are generated from the same three sources (AGENTS.md, project.fafm, .well-known/fafa) — a CI check fails on drift. remember/recall are real file-backed reads/writes proven across a process boundary in demo.ts and the test suite. See docs/MECHANISMS.md, docs/WIRING.md, docs/TRANSPORT.md.
|
|
28
35
|
key_files: [package.json, README.md, AGENTS.md, docs/MECHANISMS.md, src/server.ts, src/identity.ts, src/render-card.ts, src/author.ts, src/agents-md.ts, src/catalog-gen.ts, src/transport/http.ts]
|
|
36
|
+
monorepo:
|
|
37
|
+
packages_count: slotignored
|
|
38
|
+
build_orchestrator: slotignored
|
|
39
|
+
versioning_strategy: slotignored
|
|
40
|
+
shared_configs: slotignored
|
|
41
|
+
remote_cache: slotignored
|
|
42
|
+
commands:
|
|
43
|
+
build: npm run build
|
|
44
|
+
test: npm run test
|
|
45
|
+
dev: npm run dev
|
|
46
|
+
start: npm run start
|
package/server.json
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.Wolfe-Jam/mcp-context-card",
|
|
4
|
-
"title": "
|
|
4
|
+
"title": "MCP Context Card",
|
|
5
5
|
"description": "MCP server for a project's context (AGENTS.md), memory, and identity — base or drop-in extension.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.4.0",
|
|
7
7
|
"repository": {
|
|
8
8
|
"url": "https://github.com/Wolfe-Jam/mcp-context-card",
|
|
9
9
|
"source": "github"
|
|
10
10
|
},
|
|
11
|
+
"websiteUrl": "https://github.com/Wolfe-Jam/mcp-context-card#readme",
|
|
11
12
|
"packages": [
|
|
12
13
|
{
|
|
13
14
|
"registryType": "npm",
|
|
14
15
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
16
|
"identifier": "mcp-context-card",
|
|
16
|
-
"version": "1.
|
|
17
|
+
"version": "1.4.0",
|
|
17
18
|
"runtimeHint": "npx",
|
|
18
19
|
"transport": {
|
|
19
20
|
"type": "stdio"
|
|
@@ -21,7 +22,7 @@
|
|
|
21
22
|
"environmentVariables": [
|
|
22
23
|
{
|
|
23
24
|
"name": "MCP_CONTEXT_CARD_ROOT",
|
|
24
|
-
"description": "
|
|
25
|
+
"description": "Pins the project: a directory with AGENTS.md, project.fafm and .well-known/fafa. Unset: the host's MCP roots, then the start directory if it has an AGENTS.md.",
|
|
25
26
|
"isRequired": false
|
|
26
27
|
}
|
|
27
28
|
]
|