obelisk-mcp 0.1.4 → 0.2.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/README.md +31 -24
- package/dist/cli.mjs +1 -1
- package/dist/mcp.mjs +4 -4
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -12,10 +12,18 @@ rename.
|
|
|
12
12
|
|
|
13
13
|
## Status
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
integration are implemented. The
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
Early. Anchoring, decoration, the sidebar, suggested edits and the agent
|
|
16
|
+
integration are implemented. The plugin is in the Obsidian community plugin
|
|
17
|
+
directory, and the CLI and the MCP server are on npm as `obelisk-mcp`. None of
|
|
18
|
+
it has been exercised against a large vault.
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
Search for **Obelisk** in *Settings → Community plugins → Browse*, install it,
|
|
23
|
+
and enable it. Updates come from the same panel.
|
|
24
|
+
|
|
25
|
+
The plugin can also be added via the *Add to Obsidian* button in its
|
|
26
|
+
[directory listing](https://community.obsidian.md/plugins/obelisk).
|
|
19
27
|
|
|
20
28
|
## Features
|
|
21
29
|
|
|
@@ -32,7 +40,7 @@ and none of it has been exercised against a large vault.
|
|
|
32
40
|
- **Sidebar.** All of a note's comments in document order, or newest first from
|
|
33
41
|
the sort toggle. Click one to scroll the editor to it. Chips filter to open
|
|
34
42
|
comments, to comments carrying a suggestion, or to one agent's review pass.
|
|
35
|
-
Resolved comments stay in the list,
|
|
43
|
+
Resolved comments stay in the list, grayed rather than hidden, since they are
|
|
36
44
|
still highlighted in the note.
|
|
37
45
|
- **In-text highlighting.** Commented passages are highlighted, with a †
|
|
38
46
|
marker that opens the comment in the sidebar.
|
|
@@ -58,9 +66,9 @@ and none of it has been exercised against a large vault.
|
|
|
58
66
|
from the trash icon in its header, so striking one remark out of a thread
|
|
59
67
|
does not take the conversation with it. Both offer an undo rather than a
|
|
60
68
|
confirmation dialog.
|
|
61
|
-
- **Open to agents.** A command-line tool and an MCP server
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
- **Open to agents.** A command-line tool and an MCP server read and write the
|
|
70
|
+
same comments from outside Obsidian, so a model can review a note into the
|
|
71
|
+
sidebar, or answer the comments left for it. Its comments are
|
|
64
72
|
badged, and a whole review pass is one chip in the header with a *dismiss
|
|
65
73
|
all* on it. See below.
|
|
66
74
|
|
|
@@ -125,12 +133,12 @@ agent is running in, and an absolute path reaches a note in one it is not. The
|
|
|
125
133
|
server is listed in the official MCP registry as `io.github.zachhannum/obelisk`
|
|
126
134
|
for a client that installs from there.
|
|
127
135
|
|
|
128
|
-
**
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
136
|
+
**The agent starts it.** It speaks MCP over stdio: the agent spawns a process
|
|
137
|
+
when a session opens and kills it when the session ends, so there is no port
|
|
138
|
+
and no daemon. One process per session is also what makes a session's comments
|
|
139
|
+
share one run chip in the sidebar. A session keeps the process it spawned, so a
|
|
140
|
+
new version of the package arrives at the next one. To take it sooner,
|
|
141
|
+
reconnect from `/mcp`.
|
|
134
142
|
|
|
135
143
|
To check the registration, `claude mcp list`, or `/mcp` inside a session. To
|
|
136
144
|
check the server itself with no agent in the way:
|
|
@@ -143,22 +151,21 @@ printf '%s\n' \
|
|
|
143
151
|
| npx -y obelisk-mcp
|
|
144
152
|
```
|
|
145
153
|
|
|
146
|
-
That
|
|
147
|
-
|
|
148
|
-
looking at the agent's end of it.
|
|
154
|
+
That prints the handshake and then the four tools. A server that fails this
|
|
155
|
+
fails the same way for an agent.
|
|
149
156
|
|
|
150
157
|
For an agent that does not speak MCP, paste
|
|
151
158
|
[`docs/agents-fragment.md`](docs/agents-fragment.md) into the vault's
|
|
152
159
|
`AGENTS.md` or `CLAUDE.md`.
|
|
153
160
|
|
|
154
161
|
The one rule worth knowing: **the quote is the anchor.** A line number is never
|
|
155
|
-
one. A model asked for a line
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
one. A model asked for a line produces a plausible wrong number, which attaches
|
|
163
|
+
a comment to the wrong paragraph without looking like an error, so
|
|
164
|
+
`--near-line` only picks between identical quotes and takes a number copied out
|
|
165
|
+
of `obelisk list`. `--quote` has to appear in the note character for character,
|
|
166
|
+
and if it does not, or appears twice, nothing is written and the reason is
|
|
167
|
+
printed. `obelisk list` prints the body numbered so the exact text is there to
|
|
168
|
+
copy.
|
|
162
169
|
|
|
163
170
|
Writes are frontmatter-only and leave the body byte-identical, so they are safe
|
|
164
171
|
while the note is open in Obsidian. A write also re-reads the file first and
|
package/dist/cli.mjs
CHANGED
|
@@ -7986,7 +7986,7 @@ The closest thing in the note is:
|
|
|
7986
7986
|
Quote that, character for character.` : "";
|
|
7987
7987
|
return fail(
|
|
7988
7988
|
"quote-not-found",
|
|
7989
|
-
"That text is not in the note. The quote has to be verbatim \u2014 copy it straight out of the listed note body, including its punctuation,
|
|
7989
|
+
"That text is not in the note. The quote has to be verbatim \u2014 copy it straight out of the listed note body, including its punctuation, capitalization and spacing." + hint
|
|
7990
7990
|
);
|
|
7991
7991
|
}
|
|
7992
7992
|
function looseMatch(body, quote) {
|
package/dist/mcp.mjs
CHANGED
|
@@ -42976,7 +42976,7 @@ var StdioServerTransport = class {
|
|
|
42976
42976
|
};
|
|
42977
42977
|
|
|
42978
42978
|
// package.json
|
|
42979
|
-
var version2 = "0.
|
|
42979
|
+
var version2 = "0.2.0";
|
|
42980
42980
|
|
|
42981
42981
|
// src/bin/vault.ts
|
|
42982
42982
|
import { existsSync, statSync } from "node:fs";
|
|
@@ -43603,7 +43603,7 @@ The closest thing in the note is:
|
|
|
43603
43603
|
Quote that, character for character.` : "";
|
|
43604
43604
|
return fail(
|
|
43605
43605
|
"quote-not-found",
|
|
43606
|
-
"That text is not in the note. The quote has to be verbatim \u2014 copy it straight out of the listed note body, including its punctuation,
|
|
43606
|
+
"That text is not in the note. The quote has to be verbatim \u2014 copy it straight out of the listed note body, including its punctuation, capitalization and spacing." + hint
|
|
43607
43607
|
);
|
|
43608
43608
|
}
|
|
43609
43609
|
function looseMatch(body, quote) {
|
|
@@ -43712,7 +43712,7 @@ server.registerTool(
|
|
|
43712
43712
|
"obelisk_comment",
|
|
43713
43713
|
{
|
|
43714
43714
|
title: "Comment on a passage",
|
|
43715
|
-
description: "Leave a comment on one passage of a note. It appears in the reader's Obsidian sidebar, badged as coming from an agent.\n\n`quote` is the anchor and must appear in the note verbatim \u2014 the same characters, punctuation,
|
|
43715
|
+
description: "Leave a comment on one passage of a note. It appears in the reader's Obsidian sidebar, badged as coming from an agent.\n\n`quote` is the anchor and must appear in the note verbatim \u2014 the same characters, punctuation, capitalization and spacing. Copy it from obelisk_list; do not retype it or tidy it up. There is no way to pass a line or column, and you should not try to count them: the quote is the anchor and the tool does the arithmetic. If the quote is not found, or is found more than once, nothing is written and you are told which.\n\n`body` is markdown. To propose a specific rewrite, put it in a ```suggestion fenced block inside the body \u2014 its contents replace exactly the quoted passage when the reader clicks Apply, so a comment can explain itself and propose the change at once.",
|
|
43716
43716
|
inputSchema: {
|
|
43717
43717
|
note: noteArg,
|
|
43718
43718
|
quote: external_exports.string().describe(
|
|
@@ -43770,7 +43770,7 @@ server.registerTool(
|
|
|
43770
43770
|
"obelisk_resolve",
|
|
43771
43771
|
{
|
|
43772
43772
|
title: "Resolve or reopen a comment",
|
|
43773
|
-
description: "Mark a comment settled \u2014 the reader's sidebar
|
|
43773
|
+
description: "Mark a comment settled \u2014 the reader's sidebar grays it out and drops it from the open count.\n\nThis is what closes the loop on a comment a person left for you: read it, make the edit in the note yourself, then resolve it. Resolving a comment you did not write is allowed, but it records that what the comment asked for has been done, so resolve only once it has.",
|
|
43774
43774
|
inputSchema: {
|
|
43775
43775
|
note: noteArg,
|
|
43776
43776
|
id: external_exports.string().describe("The comment's id, from obelisk_list."),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obelisk-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "The Obelisk CLI and MCP server: comment on a passage of an Obsidian note, and propose suggested edits, from outside the app.",
|
|
5
5
|
"mcpName": "io.github.zachhannum/obelisk",
|
|
6
6
|
"bin": {
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
16
|
"dev": "node esbuild.config.mjs",
|
|
17
|
+
"lint": "eslint --max-warnings 0 .",
|
|
17
18
|
"build": "tsc --noEmit --skipLibCheck && node esbuild.config.mjs production",
|
|
18
19
|
"prepublishOnly": "npm run build",
|
|
19
20
|
"shots": "npm run build && playwright test",
|
|
@@ -28,10 +29,13 @@
|
|
|
28
29
|
"@playwright/test": "^1.62.1",
|
|
29
30
|
"@types/node": "^20.14.0",
|
|
30
31
|
"esbuild": "^0.21.5",
|
|
31
|
-
"
|
|
32
|
+
"eslint": "9.37.0",
|
|
33
|
+
"eslint-plugin-obsidianmd": "0.4.1",
|
|
34
|
+
"obsidian": "^1.13.1",
|
|
32
35
|
"obsidian-launcher": "^3.2.0",
|
|
33
36
|
"tslib": "^2.6.3",
|
|
34
37
|
"typescript": "^5.5.0",
|
|
38
|
+
"typescript-eslint": "8.61.1",
|
|
35
39
|
"yaml": "^2.9.0",
|
|
36
40
|
"zod": "^4.5.4"
|
|
37
41
|
},
|