@nesso-how/mcp 0.1.0-alpha.25 → 0.1.0-alpha.26
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.
|
@@ -9,6 +9,8 @@ export function loadStarlightDocPages() {
|
|
|
9
9
|
return JSON.parse(raw).pages;
|
|
10
10
|
}
|
|
11
11
|
catch (err) {
|
|
12
|
-
throw new Error('Missing starlight-docs.pages.json. Run `pnpm build` in packages/mcp.', {
|
|
12
|
+
throw new Error('Missing starlight-docs.pages.json. Run `pnpm build` in packages/mcp.', {
|
|
13
|
+
cause: err,
|
|
14
|
+
});
|
|
13
15
|
}
|
|
14
16
|
}
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"slug": "guides/review-mode",
|
|
29
29
|
"title": "Review mode",
|
|
30
30
|
"description": "Spaced-repetition review of your concepts with FSRS, how it queues cards, asks AI recall questions, and reschedules.",
|
|
31
|
-
"markdown": "Press `R` (or open the **Review** pill in the top bar) to start a focused study session. Review surfaces concepts whose **FSRS** state says they are due, asks you a recall question, and reschedules them based on how you self-rate.\n\nNesso uses [FSRS](https://github.com/open-spaced-repetition/ts-fsrs), a modern open-source successor to the SM-2 / Anki algorithm.\n\n## What gets reviewed\n\nEach concept node carries its own FSRS state: `stability`, `difficulty`, `due`, `lastReview`, `lastRating`, and friends. A node is **due** when `due <= now`. New, unrated concepts default to `due = 0`, which means they show up immediately the first time you open Review.\n\nThe session queue is built fresh every time you open the overlay: all due nodes, sorted by urgency, in random order within the same due bucket.\n\n## Flow\n\nFor each due concept, Review:\n\n1. **Asks a recall question** generated by the AI mentor (local or remote; the same backend you configured in [AI mentor](./ai-mentor/)). The question uses the concept's title, its relations, and the elaboration fields (definition, examples, notes). It is prompted to **not paraphrase the definition** so active recall still works.\n2. **Waits for you to think**, then click **Reveal** (or press `Space`).\n3. **Reveals** the concept's typed relations, examples, and image (the same panel you see in the Inspector).\n4. **You rate** how it felt: `Again`, `Hard`, `Good`, `Easy`. Each button shows the **predicted next interval** under it (e.g. `< 1d`, `4d`, `2mo`).\n\nFSRS then updates `stability` and `difficulty`, schedules the next `due` date, and Review advances to the next card. Done with the queue, the overlay closes; you're caught up.\n\nIf the AI backend is unavailable (no WebGPU, model not downloaded, remote endpoint unreachable), Review still works. It falls back to showing the concept title without a generated question.\n\n## Tuning FSRS\n\nUnder **Settings -> Review**:\n\n| Setting
|
|
31
|
+
"markdown": "Press `R` (or open the **Review** pill in the top bar) to start a focused study session. Review surfaces concepts whose **FSRS** state says they are due, asks you a recall question, and reschedules them based on how you self-rate.\n\nNesso uses [FSRS](https://github.com/open-spaced-repetition/ts-fsrs), a modern open-source successor to the SM-2 / Anki algorithm.\n\n## What gets reviewed\n\nEach concept node carries its own FSRS state: `stability`, `difficulty`, `due`, `lastReview`, `lastRating`, and friends. A node is **due** when `due <= now`. New, unrated concepts default to `due = 0`, which means they show up immediately the first time you open Review.\n\nThe session queue is built fresh every time you open the overlay: all due nodes, sorted by urgency, in random order within the same due bucket.\n\n## Flow\n\nFor each due concept, Review:\n\n1. **Asks a recall question** generated by the AI mentor (local or remote; the same backend you configured in [AI mentor](./ai-mentor/)). The question uses the concept's title, its relations, and the elaboration fields (definition, examples, notes). It is prompted to **not paraphrase the definition** so active recall still works.\n2. **Waits for you to think**, then click **Reveal** (or press `Space`).\n3. **Reveals** the concept's typed relations, examples, and image (the same panel you see in the Inspector).\n4. **You rate** how it felt: `Again`, `Hard`, `Good`, `Easy`. Each button shows the **predicted next interval** under it (e.g. `< 1d`, `4d`, `2mo`).\n\nFSRS then updates `stability` and `difficulty`, schedules the next `due` date, and Review advances to the next card. Done with the queue, the overlay closes; you're caught up.\n\nIf the AI backend is unavailable (no WebGPU, model not downloaded, remote endpoint unreachable), Review still works. It falls back to showing the concept title without a generated question.\n\n## Tuning FSRS\n\nUnder **Settings -> Review**:\n\n| Setting | What it does | Range |\n| -------------------- | ---------------------------------------------------------------------------------------------------- | ----------- |\n| **Target retention** | Probability of correctly recalling a concept at its next review. Higher means more frequent reviews. | 70% to 97% |\n| **Max interval** | Longest interval FSRS can schedule, in days. Caps how far into the future a card can be pushed. | 1 to 36,500 |\n\nThe defaults (90% retention, 100-year cap) match the FSRS reference defaults. Lower the retention if you're comfortable forgetting more in exchange for fewer reviews; raise the max interval if you want long-term cards to keep stretching out.\n\n## Keyboard shortcuts\n\n| Key | Action |\n| ----------------- | ------------ |\n| `Space` / `Enter` | Reveal |\n| `1` | Again |\n| `2` | Hard |\n| `3` | Good |\n| `4` | Easy |\n| `Esc` | Close review |\n\nNumeric keys only fire after the answer is revealed.\n\n## Tips\n\n- Add a **definition** in the Inspector's Notes tab. Even one short sentence per concept dramatically improves AI question quality, since the model can aim at a specific facet (pitfall, application, contrast) instead of asking something generic.\n- Pair concepts with **at least one typed edge** before reviewing them. Review questions lean on the relation graph for context; isolated nodes get vaguer questions.\n- The session count in the top bar reflects the original queue size. Cards rated `Again` that come back later increase the count past 100%; that is expected."
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"slug": "introduction",
|
package/dist/tools/get-docs.js
CHANGED
|
@@ -3,13 +3,22 @@ import { loadStarlightDocPages } from '../lib/starlight-docs.js';
|
|
|
3
3
|
function toc() {
|
|
4
4
|
const pages = loadStarlightDocPages();
|
|
5
5
|
const rows = pages.map((p) => `- \`${p.slug}\` — **${p.title}**: ${p.description}`);
|
|
6
|
-
return [
|
|
6
|
+
return [
|
|
7
|
+
'# Nesso documentation — available pages',
|
|
8
|
+
'',
|
|
9
|
+
...rows,
|
|
10
|
+
'',
|
|
11
|
+
'Call get_nesso_docs with a slug to read a page.',
|
|
12
|
+
].join('\n');
|
|
7
13
|
}
|
|
8
14
|
export function registerGetDocs(server) {
|
|
9
15
|
server.registerTool('get_nesso_docs', {
|
|
10
|
-
description:
|
|
16
|
+
description: "Nesso docs. Without a slug returns a table of contents (page slugs + descriptions). With a slug returns that page's full Markdown.",
|
|
11
17
|
inputSchema: z.object({
|
|
12
|
-
slug: z
|
|
18
|
+
slug: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Page slug to retrieve (e.g. "guides/getting-started"). Omit to list available pages.'),
|
|
13
22
|
}),
|
|
14
23
|
}, async ({ slug }) => {
|
|
15
24
|
if (!slug) {
|
|
@@ -20,12 +29,16 @@ export function registerGetDocs(server) {
|
|
|
20
29
|
if (!page) {
|
|
21
30
|
const available = pages.map((p) => p.slug).join(', ');
|
|
22
31
|
return {
|
|
23
|
-
content: [
|
|
32
|
+
content: [
|
|
33
|
+
{ type: 'text', text: `Unknown slug "${slug}". Available: ${available}` },
|
|
34
|
+
],
|
|
24
35
|
isError: true,
|
|
25
36
|
};
|
|
26
37
|
}
|
|
27
38
|
return {
|
|
28
|
-
content: [
|
|
39
|
+
content: [
|
|
40
|
+
{ type: 'text', text: [`# ${page.title}`, '', page.markdown].join('\n') },
|
|
41
|
+
],
|
|
29
42
|
};
|
|
30
43
|
});
|
|
31
44
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nesso-how/mcp",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.26",
|
|
4
4
|
"description": "MCP server exposing Nesso knowledge graph tools to LLM clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"@cfworker/json-schema": "^4.1.1",
|
|
24
24
|
"@modelcontextprotocol/server": "^2.0.0-alpha.2",
|
|
25
25
|
"zod": "^4.4.3",
|
|
26
|
-
"@nesso-how/relation-types": "0.1.0-alpha.
|
|
26
|
+
"@nesso-how/relation-types": "0.1.0-alpha.26"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^22.0.0",
|