@nesso-how/mcp 0.1.0-alpha.20 → 0.1.0-alpha.22

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/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # @nesso-how/mcp
2
+
3
+ [MCP](https://modelcontextprotocol.io/) server for [Nesso](https://nesso.how) — relation types and docs for LLM clients.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @nesso-how/mcp
9
+ # or run without install:
10
+ npx -y @nesso-how/mcp
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Add to your MCP client (Cursor, Claude Desktop, etc.):
16
+
17
+ ```json
18
+ {
19
+ "command": "npx",
20
+ "args": ["-y", "@nesso-how/mcp"]
21
+ }
22
+ ```
23
+
24
+ Tools: `get_relation_types`, `get_nesso_docs`.
25
+
26
+ Full guide: [MCP integration](https://nesso.how/docs/guides/mcp-integration/).
27
+
28
+ ## License
29
+
30
+ MIT
@@ -22,7 +22,7 @@
22
22
  "slug": "guides/mcp-integration",
23
23
  "title": "MCP",
24
24
  "description": "Connect Nesso to Claude, Cursor, or any MCP-compatible AI client.",
25
- "markdown": "The `@nesso-how/mcp` package is a [Model Context Protocol](https://modelcontextprotocol.io/) server that gives AI clients access to Nesso documentation and the full relation-type vocabulary. Once connected, models can answer questions about how Nesso works and use the correct relation names when you build graphs yourself in the app or in JSON.\n\n## Setup\n\n### Claude Desktop\n\nOpen `claude_desktop_config.json`. On macOS it lives at `~/Library/Application Support/Claude/claude_desktop_config.json`; on Windows at `%APPDATA%\\Claude\\claude_desktop_config.json`.\n\nAdd a `nesso` entry under `mcpServers`:\n\n```json\n{\n \"mcpServers\": {\n \"nesso\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@nesso-how/mcp\"]\n }\n }\n}\n```\n\nSave the file and restart Claude Desktop. The Nesso tools will be available to the model automatically.\n\n### Cursor\n\nOpen **Settings -> MCP** and add a new server with command `npx` and args `[\"-y\", \"@nesso-how/mcp\"]`.\n\n### Other MCP clients\n\nAny client that speaks the stdio MCP transport works. Run `npx -y @nesso-how/mcp` as the server command. No other configuration is required.\n\n## What it can do\n\nOnce connected, you can ask your AI client things like:\n\n- \"What relation types does Nesso support?\" (uses `get_relation_types`)\n- \"Show me the Nesso getting started guide\" (uses `get_nesso_docs`)\n\nYou can build graphs in [app.nesso.how](https://app.nesso.how) yourself, or paste graph JSON from the model via **Graph menu → Import JSON** when it follows the shape below.\n\n## Tools reference\n\n### `get_nesso_docs`\n\nFetches documentation pages from this site. Call it without a `slug` to get a table of contents, or with a slug (e.g. `\"guides/getting-started\"`) to get the full page content.\n\n### `get_relation_types`\n\nReturns the complete list of relation types with their category, line style, and symmetry. Use this whenever you need valid type names for graph JSON or explanations for the learner.\n\n### Graph JSON (Import JSON)\n\nPaste this JSON shape into **Graph menu → Import JSON** in the web or desktop app (or construct it elsewhere and import the file):\n\n```json\n{\n \"name\": \"Graph title\",\n \"nodes\": [\n {\n \"id\": \"n1\",\n \"type\": \"concept\",\n \"position\": { \"x\": 0, \"y\": 0 },\n \"data\": {\n \"text\": \"Concept label\",\n \"stability\": 0,\n \"difficulty\": 0,\n \"reps\": 0,\n \"lapses\": 0,\n \"fsrsState\": 0,\n \"due\": 0,\n \"lastReview\": 0,\n \"lastRating\": 0\n }\n }\n ],\n \"edges\": [\n {\n \"id\": \"e1\",\n \"type\": \"nesso\",\n \"source\": \"n1\",\n \"target\": \"n2\",\n \"sourceHandle\": \"out\",\n \"targetHandle\": \"in\",\n \"data\": { \"type\": \"causes\" }\n }\n ]\n}\n```\n\nCall `get_relation_types` before inventing **`data.type`** values so they match Nesso."
25
+ "markdown": "The `@nesso-how/mcp` package is a [Model Context Protocol](https://modelcontextprotocol.io/) server that gives AI clients access to Nesso documentation and the full relation-type vocabulary. Once connected, models can answer questions about how Nesso works and use the correct relation names when you build graphs yourself in the app or in JSON.\n\n## Setup\n\n### Claude Desktop\n\nOpen `claude_desktop_config.json`. On macOS it lives at `~/Library/Application Support/Claude/claude_desktop_config.json`; on Windows at `%APPDATA%\\Claude\\claude_desktop_config.json`.\n\nAdd a `nesso` entry under `mcpServers`:\n\n```json\n{\n \"mcpServers\": {\n \"nesso\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@nesso-how/mcp\"]\n }\n }\n}\n```\n\nSave the file and restart Claude Desktop. The Nesso tools will be available to the model automatically.\n\n### Cursor\n\nOpen **Settings -> MCP** and add a new server with command `npx` and args `[\"-y\", \"@nesso-how/mcp\"]`.\n\n### Other MCP clients\n\nAny client that speaks the stdio MCP transport works. Run `npx -y @nesso-how/mcp` as the server command. No other configuration is required.\n\n## What it can do\n\nOnce connected, you can ask your AI client things like:\n\n- \"What relation types does Nesso support?\" (uses `get_relation_types`)\n- \"Show me the Nesso getting started guide\" (uses `get_nesso_docs`)\n\nYou can build graphs in [app.nesso.how](https://app.nesso.how) yourself, or paste graph JSON from the model via **Graph menu → Import JSON** when it follows the shape below.\n\n## Tools reference\n\n### `get_nesso_docs`\n\nFetches documentation pages from this site. Call it without a `slug` to get a table of contents, or with a slug (e.g. `\"guides/getting-started\"`) to get the full page content.\n\n### `get_relation_types`\n\nReturns the complete list of relation types with their category, line style, symmetry, and semantic coefficients (transitive, inverse, strength, polarity, cardinality). Use this whenever you need valid type names for graph JSON or explanations for the learner.\n\n### Graph JSON (Import JSON)\n\nPaste this JSON shape into **Graph menu → Import JSON** in the web or desktop app (or construct it elsewhere and import the file). **Import** keeps structure (nodes, edges, display, elaboration) and resets FSRS / review fields to fresh defaults — personal scheduling from another user is not applied. **Export JSON** from the graph menu is share-safe the same way (no review history). Desktop workspace autosave is separate and retains your full progress.\n\n```json\n{\n \"name\": \"Graph title\",\n \"nodes\": [\n {\n \"id\": \"n1\",\n \"type\": \"concept\",\n \"position\": { \"x\": 0, \"y\": 0 },\n \"data\": {\n \"text\": \"Concept label\",\n \"stability\": 0,\n \"difficulty\": 0,\n \"reps\": 0,\n \"lapses\": 0,\n \"fsrsState\": 0,\n \"due\": 0,\n \"lastReview\": 0,\n \"lastRating\": 0\n }\n }\n ],\n \"edges\": [\n {\n \"id\": \"e1\",\n \"type\": \"nesso\",\n \"source\": \"n1\",\n \"target\": \"n2\",\n \"sourceHandle\": \"out\",\n \"targetHandle\": \"in\",\n \"data\": { \"type\": \"causes\" }\n }\n ]\n}\n```\n\nCall `get_relation_types` before inventing **`data.type`** values so they match Nesso."
26
26
  },
27
27
  {
28
28
  "slug": "guides/review-mode",
@@ -34,13 +34,13 @@
34
34
  "slug": "introduction",
35
35
  "title": "Introduction",
36
36
  "description": "What Nesso is, why it exists, and the principles it is built on.",
37
- "markdown": "Nesso is an open-source, AI-assisted knowledge graph for active learning. It is built on a specific claim about how understanding works and a specific critique of how most current tools approach it.\n\n## The problem with passive learning tools\n\nThe dominant pattern AI is settling into is passive: hand over a source, receive a summary; ask a question, receive an answer; describe what you want to learn, receive a pre-built map. This is convenient, and pedagogically counterproductive. Decades of cognitive science converge on the same conclusion: deep understanding is not received; it is constructed. When the work of deciding how concepts relate is offloaded to a system, the process that produces comprehension is bypassed.\n\nAlongside this, most learning platforms treat user data as a resource. In the context of learning, this data is uniquely sensitive: it reveals not just what someone has read, but how they reason, where they struggle, and how their understanding evolves over time. Capturing it passively, and often opaquely, is at odds with the interests of the people the tools claim to serve.\n\nFinally, most platforms are proprietary silos: closed standards, locked formats, no way to inspect or extend them. Educators, developers, and learners themselves have no meaningful recourse when a platform makes choices they disagree with or stops serving their needs.\n\n## What Nesso does instead\n\nNesso inverts the flow. The learner constructs their own knowledge structure: a typed concept graph that reflects how *they* understand, not just what they have consumed. The act of deciding which relation holds between two concepts (does X *cause* Y, or merely *enable* it? is A an *instance of* B, or a *subtype of* it?) is where elaborative processing happens. The decision is the learning.\n\nAlgorithms work on what the learner has built, not on a generic curriculum. Spaced repetition is driven by graph structure: concepts with low stability or untested connections surface before well-reinforced ones. The review queue is always a function of the learner's own map.\n\nAI is present, but with a constrained role. The AI mentor, Socrates, does not deliver pre-packaged answers. It asks questions calibrated to the learner's current graph, probing understanding, surfacing gaps, and leaving the work of constructing answers to the learner. It is designed to accelerate active thinking, not to replace it.\n\n## Principles\n\n**Constructivist by design.** Every feature is oriented around the learner doing cognitive work: drawing edges, labelling relations, writing definitions in their own words, self-rating recall. The system does not do this work for them.\n\n**Private by architecture.** Graphs are stored locally in the browser (IndexedDB). The local AI mode runs entirely in-browser via WebGPU; no data leaves the device. Privacy is an implementation detail, not a policy promise.\n\n**Open by default.** The code is MIT-licensed. Data formats are documented and importable/exportable as plain JSON. The MCP server makes the graph vocabulary available to any compatible client. Technical work done here is intended to be useful beyond this application.\n\n**Provider-agnostic AI.** Nesso talks to any OpenAI-compatible `chat/completions` endpoint. Users choose whether to run a model locally or connect a remote provider; no vendor is privileged by the architecture.\n\n## What Nesso is not\n\nNesso is not a note-taking app. It does not replace a text editor, a spaced-repetition deck manager, or a general-purpose LLM interface. It is specifically a tool for the phase of learning where understanding a domain means deciding how its concepts relate to each other, and testing whether you can hold that structure under questioning.\n\nIt is also not a finished product. It is an alpha-stage open-source project. Some features are rough, some planned items are not yet built, and the codebase is publicly available for inspection and contribution.\n\n---\n\nThe remainder of this documentation covers how to use the app and how to integrate with it programmatically. If you want to start immediately, [Getting started](./guides/getting-started/) has everything you need."
37
+ "markdown": "Nesso is an open-source, AI-assisted knowledge graph for active learning. It is built on a specific claim about how understanding works and a specific critique of how most current tools approach it.\n\n## The problem with passive learning tools\n\nThe dominant pattern AI is settling into is passive: hand over a source, receive a summary; ask a question, receive an answer; describe what you want to learn, receive a pre-built map. This is convenient, and pedagogically counterproductive. Decades of cognitive science converge on the same conclusion: deep understanding is not received; it is constructed. When the work of deciding how concepts relate is offloaded to a system, the process that produces comprehension is bypassed.\n\nAlongside this, most learning platforms treat user data as a resource. In the context of learning, this data is uniquely sensitive: it reveals not just what someone has read, but how they reason, where they struggle, and how their understanding evolves over time. Capturing it passively, and often opaquely, is at odds with the interests of the people the tools claim to serve.\n\nFinally, most platforms are proprietary silos: closed standards, locked formats, no way to inspect or extend them. Educators, developers, and learners themselves have no meaningful recourse when a platform makes choices they disagree with or stops serving their needs.\n\n## What Nesso does instead\n\nNesso inverts the flow. The learner constructs their own knowledge structure: a typed concept graph that reflects how _they_ understand, not just what they have consumed. The act of deciding which relation holds between two concepts (does X _cause_ Y, or merely _enable_ it? is A an _instance of_ B, or a _subtype of_ it?) is where elaborative processing happens. The decision is the learning.\n\nAlgorithms work on what the learner has built, not on a generic curriculum. Spaced repetition is driven by graph structure: concepts with low stability or untested connections surface before well-reinforced ones. The review queue is always a function of the learner's own map.\n\nAI is present, but with a constrained role. The AI mentor, Socrates, does not deliver pre-packaged answers. It asks questions calibrated to the learner's current graph, probing understanding, surfacing gaps, and leaving the work of constructing answers to the learner. It is designed to accelerate active thinking, not to replace it.\n\n## Principles\n\n**Constructivist by design.** Every feature is oriented around the learner doing cognitive work: drawing edges, labelling relations, writing definitions in their own words, self-rating recall. The system does not do this work for them.\n\n**Private by architecture.** In the web app, graphs are stored locally in the browser (IndexedDB). In the **desktop app** (Tauri), each graph is also mirrored to a `.json` file in a workspace folder you can open in any editor (default: app data; optional custom folder in **Settings → Data**). The local AI mode runs entirely in-browser via WebGPU; no data leaves the device. Privacy is an implementation detail, not a policy promise.\n\n**Open by default.** The code is MIT-licensed. Data formats are documented and importable/exportable as plain JSON. The MCP server makes the graph vocabulary available to any compatible client. Technical work done here is intended to be useful beyond this application.\n\n**Provider-agnostic AI.** Nesso talks to any OpenAI-compatible `chat/completions` endpoint. Users choose whether to run a model locally or connect a remote provider; no vendor is privileged by the architecture.\n\n## What Nesso is not\n\nNesso is not a note-taking app. It does not replace a text editor, a spaced-repetition deck manager, or a general-purpose LLM interface. It is specifically a tool for the phase of learning where understanding a domain means deciding how its concepts relate to each other, and testing whether you can hold that structure under questioning.\n\nIt is also not a finished product. It is an alpha-stage open-source project. Some features are rough, some planned items are not yet built, and the codebase is publicly available for inspection and contribution.\n\n---\n\nThe remainder of this documentation covers how to use the app and how to integrate with it programmatically. If you want to start immediately, [Getting started](./guides/getting-started/) has everything you need."
38
38
  },
39
39
  {
40
40
  "slug": "reference/relation-types",
41
41
  "title": "Relation types",
42
- "description": "The 21 semantic relation types across 7 categories in Nesso.",
43
- "markdown": "Edges in Nesso carry a **semantic type**: a named relation that describes how two concepts are connected. There are 21 types grouped into 7 categories. Each category has a distinct colour; each type has a line style and a glyph.\n\n## Taxonomic\n\n*What kind of thing is it?*\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `is-a` | is a | solid | triangle-up |\n| `instance-of` | instance of | solid | circle-dot |\n| `subtype-of` | subtype of | double | triangle-up |\n\n## Structural\n\n*What is it made of or composed from?*\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `part-of` | part of | solid | diamond |\n| `made-of` | made of | dashed | hash |\n| `contains` | contains | solid | diamond-open |\n\n## Causal\n\n*What does it do or prevent?*\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `causes` | causes | solid | arrow-right |\n| `produces` | produces | solid | asterisk |\n| `enables` | enables | dotted | key |\n| `prevents` | prevents | dotted | block |\n| `triggers` | triggers | solid | spark |\n| `inhibits` | inhibits | dotted | minus |\n\n## Dependency\n\n*What does it need or serve?*\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `requires` | requires | solid | anchor |\n| `uses` | uses | dashed | tool |\n| `used-for` | used for | dashed | flag |\n\n## Temporal\n\n*When or where does it happen?*\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `precedes` | precedes | solid | chevron-r |\n| `occurs-in` | occurs in | dotted | ring |\n\n## Opposition\n\n*What does it contrast with?* Symmetric.\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `contrasts-with` | contrasts with | wavy | tilde |\n| `opposite-of` | opposite of | double | x |\n\n## Similarity\n\n*What is it like?* Symmetric.\n\n| Type | Label | Line | Glyph |\n|------|-------|------|-------|\n| `similar-to` | similar to | dashed | approx |\n| `analogous-to` | analogous to | dotted | arrows-lr |\n\n---\n\n**Symmetric** relations (opposition and similarity) carry the same meaning in both directions; the edge has no arrowhead.\n\n**Edge encoding** is controlled per-graph via Settings -> Appearance -> Edge encoding:\n- `full`: glyph and line style\n- `category`: colour only\n- `minimal`: plain line"
42
+ "description": "The 52 semantic relation types across 8 categories in Nesso.",
43
+ "markdown": "Edges in Nesso carry a **semantic type**: a named relation that describes how two concepts are connected. There are 52 types grouped into 8 categories. Each category has a distinct colour; each type has a line style, a glyph, and a set of semantic coefficients used by graph-analysis algorithms.\n\nAsymmetric relations come in **inverse pairs** (e.g. `subtype-of` / `has-subtype`) so traversal in either direction is first-class. Symmetric relations (`contrasts-with`, `opposite-of`, `similar-to`, `analogous-to`, `overlaps-with`, `contradicts`) are self-inverse.\n\n## Coefficients\n\nEach relation type declares:\n\n- **`symmetric`** — `true` when the edge carries the same meaning in both directions (no arrowhead).\n- **`transitive`** — `Y` (strict), `N` (none), or `weak` (transitivity with decay; algorithms may discount per step).\n- **`inverse`** — the canonical inverse type in the set. Self for symmetric relations.\n- **`strength`** — per-type semantic weight in `0..1`. Encodes how \"tight\" the relation is, not per-edge confidence.\n- **`polarity`** — `+1` positive effect, `-1` antagonistic, `0` neutral/structural. From signed-network theory.\n- **`cardinality`** — expected mapping pattern: `1-1`, `1-N`, `N-1`, or `N-N` (no constraint).\n\n## Taxonomic\n\n_What kind of thing is it?_\n\n| Type | Label | Inverse | T | S | P | Card |\n| -------------- | ------------ | -------------- | --- | ---- | --- | ---- |\n| `subtype-of` | subtype of | `has-subtype` | Y | 0.90 | 0 | N-1 |\n| `has-subtype` | has subtype | `subtype-of` | Y | 0.90 | 0 | 1-N |\n| `instance-of` | instance of | `has-instance` | N | 0.95 | 0 | N-1 |\n| `has-instance` | has instance | `instance-of` | N | 0.95 | 0 | 1-N |\n\n## Structural\n\n_What is it made of or composed from?_\n\n| Type | Label | Inverse | T | S | P | Card |\n| ---------- | -------- | ---------- | ---- | ---- | --- | ---- |\n| `part-of` | part of | `contains` | Y | 0.85 | 0 | N-1 |\n| `contains` | contains | `part-of` | Y | 0.85 | 0 | 1-N |\n| `made-of` | made of | `composes` | weak | 0.75 | 0 | N-N |\n| `composes` | composes | `made-of` | weak | 0.75 | 0 | N-N |\n\n## Causal\n\n_What does it do or prevent?_\n\n| Type | Label | Inverse | T | S | P | Card |\n| -------------- | ------------ | -------------- | ---- | ---- | --- | ---- |\n| `causes` | causes | `caused-by` | N | 0.85 | +1 | N-N |\n| `caused-by` | caused by | `causes` | N | 0.85 | +1 | N-N |\n| `produces` | produces | `produced-by` | N | 0.70 | +1 | N-N |\n| `produced-by` | produced by | `produces` | N | 0.70 | +1 | N-N |\n| `enables` | enables | `enabled-by` | weak | 0.60 | +1 | N-N |\n| `enabled-by` | enabled by | `enables` | weak | 0.60 | +1 | N-N |\n| `prevents` | prevents | `prevented-by` | N | 0.85 | −1 | N-N |\n| `prevented-by` | prevented by | `prevents` | N | 0.85 | −1 | N-N |\n| `triggers` | triggers | `triggered-by` | N | 0.70 | +1 | N-N |\n| `triggered-by` | triggered by | `triggers` | N | 0.70 | +1 | N-N |\n| `inhibits` | inhibits | `inhibited-by` | N | 0.55 | −1 | N-N |\n| `inhibited-by` | inhibited by | `inhibits` | N | 0.55 | −1 | N-N |\n| `disables` | disables | `disabled-by` | weak | 0.60 | −1 | N-N |\n| `disabled-by` | disabled by | `disables` | weak | 0.60 | −1 | N-N |\n| `consumes` | consumes | `consumed-by` | N | 0.65 | −1 | N-N |\n| `consumed-by` | consumed by | `consumes` | N | 0.65 | −1 | N-N |\n| `delays` | delays | `delayed-by` | weak | 0.55 | −1 | N-N |\n| `delayed-by` | delayed by | `delays` | weak | 0.55 | −1 | N-N |\n\n`prevents` (total blockage), `inhibits` (partial reduction), and `disables` (switches off a capacity or function) are three distinct negative types — intensity and mechanism are semantic properties of the type, not a per-edge value. `disables` is the counterpart to `enables`; use `prevents` when an outcome is fully blocked and `inhibits` when it is only reduced.\n\nThe category also includes `consumes` (resource destruction, distinct from dependency's `uses`) and `delays` (slows or postpones an effect; polarity −1 because delay hinders the outcome).\n\n## Dependency\n\n_What does it need or serve?_\n\n| Type | Label | Inverse | T | S | P | Card |\n| ------------- | ----------- | ------------- | ---- | ---- | --- | ---- |\n| `requires` | requires | `required-by` | Y | 0.85 | 0 | N-N |\n| `required-by` | required by | `requires` | Y | 0.85 | 0 | N-N |\n| `uses` | uses | `used-by` | weak | 0.50 | 0 | N-N |\n| `used-by` | used by | `uses` | weak | 0.50 | 0 | N-N |\n| `used-for` | used for | `purpose-of` | N | 0.55 | +1 | N-N |\n| `purpose-of` | purpose of | `used-for` | N | 0.55 | +1 | N-N |\n\n## Temporal\n\n_When or where does it happen?_\n\n| Type | Label | Inverse | T | S | P | Card |\n| ---------------- | -------------- | ---------------- | --- | ---- | --- | ---- |\n| `precedes` | precedes | `follows` | Y | 0.50 | 0 | N-N |\n| `follows` | follows | `precedes` | Y | 0.50 | 0 | N-N |\n| `occurs-in` | occurs in | `has-occurrence` | Y | 0.40 | 0 | N-1 |\n| `has-occurrence` | has occurrence | `occurs-in` | Y | 0.40 | 0 | 1-N |\n| `during` | during | `spans` | Y | 0.55 | 0 | N-1 |\n| `spans` | spans | `during` | Y | 0.55 | 0 | 1-N |\n| `overlaps-with` | overlaps with | self (symmetric) | N | 0.45 | 0 | N-N |\n| `derives-from` | derives from | `gives-rise-to` | Y | 0.70 | 0 | N-1 |\n| `gives-rise-to` | gives rise to | `derives-from` | Y | 0.70 | 0 | 1-N |\n\n`during` / `spans` model Allen's interval-in-interval containment (peer intervals). Distinct from `occurs-in` which localizes a quasi-point event in a period (different scale).\n\n`derives-from` / `gives-rise-to` capture genealogical descent — temporal lineage with transformative continuity (languages, species, ideas), distinct from `caused-by` (direct influence without continuity) and from taxonomic `subtype-of` (class membership at a snapshot in time, not historical descent).\n\n## Opposition\n\n_What does it contrast with?_ Symmetric.\n\n| Type | Label | T | S | P | Card |\n| ---------------- | -------------- | --- | ---- | --- | ---- |\n| `contrasts-with` | contrasts with | N | 0.50 | −1 | N-N |\n| `opposite-of` | opposite of | N | 0.80 | −1 | 1-1 |\n\n## Similarity\n\n_What is it like?_ Symmetric.\n\n| Type | Label | T | S | P | Card |\n| -------------- | ------------ | ---- | ---- | --- | ---- |\n| `similar-to` | similar to | weak | 0.40 | +1 | N-N |\n| `analogous-to` | analogous to | N | 0.30 | +1 | N-N |\n\n## Epistemic\n\n_How do we know?_\n\n| Type | Label | Inverse | T | S | P | Card |\n| -------------- | ------------ | ---------------- | ---- | ---- | --- | ---- |\n| `supports` | supports | `supported-by` | weak | 0.70 | +1 | N-N |\n| `supported-by` | supported by | `supports` | weak | 0.70 | +1 | N-N |\n| `contradicts` | contradicts | self (symmetric) | N | 0.75 | −1 | N-N |\n| `explains` | explains | `explained-by` | weak | 0.80 | 0 | N-N |\n| `explained-by` | explained by | `explains` | weak | 0.80 | 0 | N-N |\n| `defines` | defines | `defined-by` | N | 0.90 | 0 | 1-1 |\n| `defined-by` | defined by | `defines` | N | 0.90 | 0 | 1-1 |\n\n`defines` goes from the defining expression (definiens) to the term being defined (definiendum) e.g. \"F = ma defines force\". Cardinality 1-1 enforces one canonical definition per term.\n\n`contradicts` is symmetric (mutual logical incompatibility), unlike `supports` and `explains` which are asymmetric evidence/explanans → claim relations.\n\n---\n\n**Edge encoding** is controlled per-graph via Settings Appearance Edge encoding:\n\n- `full`: glyph and line style\n- `category`: colour only\n- `minimal`: plain line"
44
44
  }
45
45
  ]
46
46
  }
@@ -2,7 +2,9 @@ import * as z from 'zod/v4';
2
2
  import { RELATION_TYPES, RELATION_CATEGORY_META } from '@nesso-how/relation-types';
3
3
  export function registerGetRelationTypes(server) {
4
4
  server.registerTool('get_relation_types', {
5
- description: 'Returns all 21 semantic relation types supported by Nesso, grouped by category. ' +
5
+ description: 'Returns all 52 semantic relation types supported by Nesso, grouped by 8 categories. ' +
6
+ 'Each type carries semantic coefficients (transitive, inverse, strength, polarity, cardinality) ' +
7
+ 'in addition to its visual encoding. ' +
6
8
  'Use this when you need valid relation type names for graph JSON or explanations for the user.',
7
9
  inputSchema: z.object({}),
8
10
  }, async () => {
@@ -16,6 +18,11 @@ export function registerGetRelationTypes(server) {
16
18
  label: def.label,
17
19
  line: def.line,
18
20
  symmetric: def.symmetric,
21
+ transitive: def.transitive,
22
+ inverse: def.inverse,
23
+ strength: def.strength,
24
+ polarity: def.polarity,
25
+ cardinality: def.cardinality,
19
26
  })),
20
27
  }));
21
28
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nesso-how/mcp",
3
- "version": "0.1.0-alpha.20",
3
+ "version": "0.1.0-alpha.22",
4
4
  "description": "MCP server exposing Nesso knowledge graph tools to LLM clients",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -16,9 +16,9 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "@cfworker/json-schema": "^4.1.1",
19
- "@modelcontextprotocol/server": "latest",
20
- "@nesso-how/relation-types": "^0.1.0-alpha.16",
21
- "zod": "latest"
19
+ "@modelcontextprotocol/server": "^2.0.0-alpha.2",
20
+ "zod": "^4.4.3",
21
+ "@nesso-how/relation-types": "0.1.0-alpha.22"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^22.0.0",