notesmith-mcp 0.1.0__py3-none-any.whl
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.
- notesmith_mcp-0.1.0.dist-info/METADATA +288 -0
- notesmith_mcp-0.1.0.dist-info/RECORD +16 -0
- notesmith_mcp-0.1.0.dist-info/WHEEL +5 -0
- notesmith_mcp-0.1.0.dist-info/entry_points.txt +3 -0
- notesmith_mcp-0.1.0.dist-info/licenses/LICENSE +21 -0
- notesmith_mcp-0.1.0.dist-info/top_level.txt +1 -0
- privatenote_mcp/__init__.py +2 -0
- privatenote_mcp/_unicode_tables.py +449 -0
- privatenote_mcp/agent_export.py +284 -0
- privatenote_mcp/citations.py +142 -0
- privatenote_mcp/memory_mirror.py +105 -0
- privatenote_mcp/notes_db.py +1175 -0
- privatenote_mcp/owned_files.py +421 -0
- privatenote_mcp/schema.sql +95 -0
- privatenote_mcp/server.py +949 -0
- privatenote_mcp/span_strip.py +315 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: notesmith-mcp
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP connector for Notesmith's local notes, requires Notesmith installed
|
|
5
|
+
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://psychosonicconsulting.com/notesmith
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: mcp>=2.0
|
|
11
|
+
Provides-Extra: citations
|
|
12
|
+
Requires-Dist: bibliome-mcp>=0.3.0; extra == "citations"
|
|
13
|
+
Provides-Extra: test
|
|
14
|
+
Requires-Dist: pytest; extra == "test"
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
|
|
17
|
+
# notesmith-mcp
|
|
18
|
+
|
|
19
|
+
MCP connector for [Notesmith](https://github.com/negativetime), a local-only Mac note app.
|
|
20
|
+
Reads your notes on this machine and hands them to the MCP client you connect. The server
|
|
21
|
+
itself never opens a network connection. What happens to a note after the client reads it is
|
|
22
|
+
up to that client.
|
|
23
|
+
|
|
24
|
+
## Install
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pip install notesmith-mcp
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Then point your MCP client at the `notesmith-mcp` command. (This package was
|
|
31
|
+
called `privatenote-mcp` before Notesmith's rename; that name still works too,
|
|
32
|
+
installed alongside `notesmith-mcp` as an alias, so an existing config that
|
|
33
|
+
calls it doesn't break.)
|
|
34
|
+
|
|
35
|
+
## Tools
|
|
36
|
+
|
|
37
|
+
| Tool | What it does |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `search_notes(q, k=20)` | Full-text search over titles and body. Every word is a prefix, so `orga` finds "Organize". |
|
|
40
|
+
| `read_note(note_id)` | One note in full: blocks, notebook, tags, timestamps. Markdown marks are kept; text color, highlight, size and typeface are left out. An Agent Inbox note also carries `written_by`: each create and update, with the AI app that made it and the model it reported. |
|
|
41
|
+
| `recent_notes(k=20)` | Most recently edited notes, newest first. |
|
|
42
|
+
| `notes_status()` | Whether the database was found, and what is in it. Run this first if something looks wrong. |
|
|
43
|
+
| `list_notebooks()` | The Agent Inbox's notebooks and how many notes each holds. One notebook per task keeps a task's checkpoint and notes together. |
|
|
44
|
+
| `create_note(title, body, tags, notebook, model)` | Add a note to the Agent Inbox. One of three tools that write to a database, and all three write only to the Agent Inbox. `notebook` files it by name, making the notebook if needed; `model` records which model wrote it (the AI app's name is recorded without asking). |
|
|
45
|
+
| `update_note(note_id, title, body, tags, notebook, model, base_updated_at)` | Rewrite a note in the Agent Inbox. Omit a field to leave it alone; pass it to replace it. Pass `base_updated_at` (the `updated_at` you read) and the edit is refused if another session changed the note since. An empty `notebook` takes the note out of its notebook. The user's own notes are opened read-only and cannot be reached. |
|
|
46
|
+
| `delete_note(note_id)` | Delete a note from the Agent Inbox, to retire one that has become wrong rather than leave it beside its replacement. |
|
|
47
|
+
| `suggest_citations(note_id, k=5)` | Documents in the user's Bibliome PDF library that might relate to one note. Read-only, needs the `citations` extra, see below. |
|
|
48
|
+
| `export_agent_notes(target_dir)` | Write every Agent Inbox note to `target_dir` as one `.md` file each, idempotently. Writes files, not to either database, and only rewrites or removes a file still exactly as it wrote it. See "Feeding the Agent Inbox into Bibliome" below. |
|
|
49
|
+
|
|
50
|
+
Every result carries a `privatenote://note/<id>` URL that opens the note in the app.
|
|
51
|
+
|
|
52
|
+
## Encrypted blocks are never returned
|
|
53
|
+
|
|
54
|
+
Notesmith can encrypt individual blocks with a passphrase. Those blocks are never
|
|
55
|
+
readable here, not their text, not through search. A note containing them reports
|
|
56
|
+
`encrypted_blocks_hidden`, so a model summarising it knows it is not seeing the whole note
|
|
57
|
+
rather than confidently describing a fraction of it.
|
|
58
|
+
|
|
59
|
+
This holds two ways: the app stores an encrypted block with empty text by construction, and
|
|
60
|
+
this server filters by block kind regardless. Either alone would do; both are kept because
|
|
61
|
+
this is the code that hands note content to another process.
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
| Variable | Effect |
|
|
66
|
+
|---|---|
|
|
67
|
+
| `PRIVATENOTE_DB_PATH` | Use this `notes.sqlite` instead of searching. |
|
|
68
|
+
| `PRIVATENOTE_APP_DIR` | Where Notesmith.app is (only used for reporting). |
|
|
69
|
+
|
|
70
|
+
Without them, the App Sandbox container is checked first, then `~/Library/Application Support`.
|
|
71
|
+
|
|
72
|
+
## How this differs from `bibliome-mcp`
|
|
73
|
+
|
|
74
|
+
`bibliome-mcp` imports Bibliome's search engine out of the app bundle, because that engine is
|
|
75
|
+
Python. Notesmith's engine is Swift, so there is nothing to import: this server reads the
|
|
76
|
+
same SQLite file directly.
|
|
77
|
+
|
|
78
|
+
That is why there are no `fastembed`/`numpy`/`mlx` dependencies by default. The trade-off is
|
|
79
|
+
that the app and this server share a *schema* rather than sharing *code*, so
|
|
80
|
+
`tests/test_schema_drift.py` re-checks the schema these tests run against the real app
|
|
81
|
+
database whenever you name that database (see Testing below).
|
|
82
|
+
|
|
83
|
+
## Citations from Bibliome
|
|
84
|
+
|
|
85
|
+
`suggest_citations` is the one tool that reaches outside Notesmith: it hands a note's own
|
|
86
|
+
text to Bibliome's search engine and comes back with documents that might relate to it. It
|
|
87
|
+
needs [Bibliome](https://apps.apple.com/us/app/bibliome-library/id6786826590?mt=12) installed
|
|
88
|
+
with a library indexed, and this server's `citations` extra:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pip install "notesmith-mcp[citations]"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
That extra is `bibliome-mcp` itself, imported in-process for its `Engine` rather than spoken
|
|
95
|
+
to over MCP, the two are Python packages on the same machine for the same person, and there
|
|
96
|
+
is only one correct way to reach Bibliome's engine (see `bibliome-mcp`'s own README on why its
|
|
97
|
+
bundled interpreter can never be run as a subprocess). Without the extra, every other tool
|
|
98
|
+
here still works exactly as before; only `suggest_citations` returns an error naming it.
|
|
99
|
+
|
|
100
|
+
`suggest_citations` is read-only on both sides, nothing is written to the Agent Inbox or
|
|
101
|
+
anywhere else. Call `create_note` yourself with a result's `citation_markdown` once you've
|
|
102
|
+
picked one worth keeping; Notesmith recognises that link shape (`mypdflibrarian://open-pdf?…`)
|
|
103
|
+
the same way whether it arrived by hand or through this server, and renders and graphs it as a
|
|
104
|
+
citation either way.
|
|
105
|
+
|
|
106
|
+
## Feeding the Agent Inbox into Bibliome
|
|
107
|
+
|
|
108
|
+
The reverse direction: `export_agent_notes` writes every Agent Inbox note to a folder as a plain
|
|
109
|
+
`.md` file, so Bibliome's own indexer, it already reads Markdown, see Bibliome's Settings ▸
|
|
110
|
+
File Types ▸ Markdown, off by default, can fold your agent's notes into the SAME search and
|
|
111
|
+
semantic index it builds for your PDFs. No new engine, no `citations` extra: this is standard-
|
|
112
|
+
library file I/O, the same as every other tool here except `suggest_citations`.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
notesmith-mcp --export-agent-notes ~/Documents/PDF\ Library/Agent\ Notes
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
or as a tool, from any MCP client: `export_agent_notes(target_dir="~/Documents/PDF Library/Agent Notes")`.
|
|
119
|
+
|
|
120
|
+
A client may only export inside a root you name. This is the one tool here that creates a
|
|
121
|
+
file, and the path used to come from whoever called it, so a model that picked the path could
|
|
122
|
+
make directories and files anywhere this process can write. Set `PRIVATENOTE_EXPORT_ROOT` to the
|
|
123
|
+
folder exports belong in and nothing outside it is accepted, symlinks and `..` included. With it
|
|
124
|
+
unset the tool refuses and says so. The `--export-agent-notes` command and the launchd refresh
|
|
125
|
+
are deliberately NOT confined: there the path is one you typed, which is not the threat.
|
|
126
|
+
|
|
127
|
+
Three things have to be true for Bibliome to actually pick the result up:
|
|
128
|
+
|
|
129
|
+
1. The target directory is INSIDE Bibliome's library root. Bibliome scans one root tree;
|
|
130
|
+
a folder outside it is invisible however often this runs.
|
|
131
|
+
2. Markdown is enabled in Bibliome's Settings ▸ File Types (off by default, Bibliome only
|
|
132
|
+
touches formats you explicitly turn on).
|
|
133
|
+
3. Bibliome re-scans, its own scan/reindex, on its own schedule or triggered by hand; this
|
|
134
|
+
tool only writes files, it does not reach into Bibliome's process at all.
|
|
135
|
+
|
|
136
|
+
Each note becomes `<slug>-<8 hex chars of the note id>.md`. A re-run rewrites a file only when
|
|
137
|
+
its note changed, and removes the old file of a note since renamed or deleted in the Agent
|
|
138
|
+
Inbox, so Bibliome does not go on indexing text that no longer exists.
|
|
139
|
+
|
|
140
|
+
It removes only what it can prove it wrote. The proof is a manifest the export keeps in the
|
|
141
|
+
folder, `.privatenote-mcp-export.json`, listing every file it wrote with a SHA-256 of the bytes.
|
|
142
|
+
A file is rewritten or removed only while the manifest lists it and it still holds exactly
|
|
143
|
+
those bytes. Nothing else in the folder is changed or removed, whatever it is called:
|
|
144
|
+
|
|
145
|
+
- your own files, including one named like an export, such as `report-20260912.md`;
|
|
146
|
+
- an exported file you edited, which is kept and listed under `left_alone` in the result;
|
|
147
|
+
- an exported file the run cannot read, such as one with no read permission or an iCloud file
|
|
148
|
+
that will not download, which is also kept and listed, and dealt with once it can be read; the
|
|
149
|
+
rest of the run goes ahead;
|
|
150
|
+
- anything the manifest does not list: exports written before the manifest existed, or every
|
|
151
|
+
export once the manifest is deleted.
|
|
152
|
+
|
|
153
|
+
`--export-agent-notes` prints every kept file with the reason, and every file named like an
|
|
154
|
+
export that the manifest does not list. The MCP tool's reply names only the export's own files:
|
|
155
|
+
for the others it gives `untracked_count`, how many there are, so an agent never learns what
|
|
156
|
+
your own files are called.
|
|
157
|
+
|
|
158
|
+
Deleting the manifest is safe. The next run removes nothing, and records again the files that
|
|
159
|
+
still hold exactly the current export. If the manifest cannot be read, a run removes nothing and
|
|
160
|
+
leaves it as it is; delete it if it stays that way. To swap a kept file for the current version
|
|
161
|
+
of its note, move the file out of the folder and run the export again.
|
|
162
|
+
|
|
163
|
+
Each file is written beside its name and then renamed onto it, so a run cut short, by a full disk
|
|
164
|
+
say, leaves the previous export whole and the next run repairs it. On macOS and Linux two runs on
|
|
165
|
+
one folder take turns; one that waits more than 30 seconds gives up with an error and changes
|
|
166
|
+
nothing. Where the folder cannot be locked at all (some network mounts, and Windows), runs do not
|
|
167
|
+
wait for each other; on macOS and Linux the result's `lock_warning` says when that happened.
|
|
168
|
+
|
|
169
|
+
### Keeping it fresh without either app open
|
|
170
|
+
|
|
171
|
+
`scripts/refresh_agent_notes.py` runs the export and, optionally, mirrors a folder of an MCP
|
|
172
|
+
client's own frontmatter-Markdown memory files into `<Agent Notes>/Claude Memory/`, rewritten so
|
|
173
|
+
Bibliome's reader sees a heading instead of a YAML block (frontmatter dropped, `description`
|
|
174
|
+
promoted to the title, index files like `MEMORY.md` skipped). Idempotent and stale-swept by the
|
|
175
|
+
same rules as the export, with its own manifest (`.privatenote-mcp-mirror.json`): it removes
|
|
176
|
+
only copies it wrote and nobody changed, never another file in that folder. Every kept file is
|
|
177
|
+
named in the refresh log. `scripts/com.langberg.privatenote.refresh.plist.template` is a launchd agent that
|
|
178
|
+
runs it at login and every 15 minutes; the install commands are in the file. ⚠ It runs through
|
|
179
|
+
`scripts/build_refresh_launcher.sh`'s signed launcher, which needs Full Disk Access: since Sonoma,
|
|
180
|
+
reading Notesmith's container from outside asks for consent that lasts only one process, so a
|
|
181
|
+
bare Python job asked every 15 minutes and silently exported nothing whenever nobody clicked. It needs neither
|
|
182
|
+
Notesmith nor Bibliome running, but Bibliome still has to build its Meaning index on its own
|
|
183
|
+
schedule for any of it to become searchable; nothing here reaches into Bibliome's process.
|
|
184
|
+
|
|
185
|
+
Whether this is worth turning on scales with the Agent Inbox itself: a thin, fragmentary note
|
|
186
|
+
produces weak matches wherever it is searched from, the same lesson `suggest_citations` already
|
|
187
|
+
taught in the other direction. A substantial Agent Inbox (a few dozen notes of real technical
|
|
188
|
+
writing, not one-line placeholders) is the case this is actually for.
|
|
189
|
+
|
|
190
|
+
## Tests
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
python3 -m pytest tests/ -q
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Three layers:
|
|
197
|
+
|
|
198
|
+
- `test_notes_db.py`, the SQLite layer against a real database built from the app's real
|
|
199
|
+
schema, including FTS5 operators in queries (`AND`, a bare `"`, an unclosed paren) which are
|
|
200
|
+
searched for rather than executed.
|
|
201
|
+
- `test_mcp_protocol.py`, launches the real console entry point as a subprocess and speaks
|
|
202
|
+
actual JSON-RPC over stdio. Everything between the database and the client, tool
|
|
203
|
+
registration, schema generation, argument coercion, the handshake, is code no unit test
|
|
204
|
+
touches, and it is where a server that "works" fails to connect.
|
|
205
|
+
- `test_schema_contract.py`, runs every query this server issues against a database
|
|
206
|
+
built from the fixture. No Notesmith install needed, so unlike the drift check below it
|
|
207
|
+
never skips.
|
|
208
|
+
- `test_schema_drift.py`: compares the fixture against the real app database when you
|
|
209
|
+
name it, and skips loudly rather than passing silently when you do not. An ordinary run
|
|
210
|
+
opens nothing in the app's container; to compare, run
|
|
211
|
+
`PRIVATENOTE_LIVE_SCHEMA_DB="$HOME/Library/Containers/com.langberg.privatenote/Data/Library/Application Support/PrivateNote/notes.sqlite" pytest tests/test_schema_drift.py`.
|
|
212
|
+
- `test_no_test_reaches_the_real_machine.py`: every test runs with a home of its own and
|
|
213
|
+
no store, and a test that resolves, opens, lists or changes anything in a real store place
|
|
214
|
+
fails. The one exception is the database named for the drift check.
|
|
215
|
+
|
|
216
|
+
### How the schema stays in sync
|
|
217
|
+
|
|
218
|
+
The app and this server share a *schema*, not code, and two programs that share a schema will
|
|
219
|
+
drift. `tests/schema.sql` is generated from Notesmith's own GRDB migrator, it is not
|
|
220
|
+
hand-written, and the guard is two-sided so neither direction can fail quietly:
|
|
221
|
+
|
|
222
|
+
| What changes | What fails | Needs Notesmith installed? |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| A migration lands in the app | the app's `SchemaContractTests` | no |
|
|
225
|
+
| This fixture goes stale | `test_schema_contract.py` | no |
|
|
226
|
+
| Both repos are checked out | the app's cross-repo check | no |
|
|
227
|
+
| The app is installed here | `test_schema_drift.py` with `PRIVATENOTE_LIVE_SCHEMA_DB` | yes (skips otherwise) |
|
|
228
|
+
|
|
229
|
+
To regenerate after an intentional migration, in the Notesmith repo:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
REGENERATE_SCHEMA_CONTRACT=1 swift test --filter SchemaContractTests
|
|
233
|
+
cp PrivateNoteCore/schema-contract.sql ../privatenote-mcp/tests/schema.sql
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Licence
|
|
237
|
+
|
|
238
|
+
MIT.
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
## Using it as a memory store, without Notesmith
|
|
242
|
+
|
|
243
|
+
Notesmith is macOS and iOS only. This server does not need it.
|
|
244
|
+
|
|
245
|
+
On Windows or Linux there is no library, and the agent store is the whole
|
|
246
|
+
thing: a searchable, on-device memory an MCP client can write to and read back.
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
pip install notesmith-mcp
|
|
250
|
+
notesmith-mcp --init # create the store
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`--init` writes it to `%LOCALAPPDATA%\PrivateNote\` on Windows and
|
|
254
|
+
`~/.local/share/PrivateNote/` on Linux, or pass `--path`. It refuses to touch an
|
|
255
|
+
existing file, so running it twice is safe.
|
|
256
|
+
|
|
257
|
+
Then point a client at the `notesmith-mcp` command. Claude Code:
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{ "mcpServers": { "notesmith": { "type": "stdio", "command": "notesmith-mcp" } } }
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Eight tools work anywhere: `search_notes`, `read_note`, `recent_notes`,
|
|
264
|
+
`list_notebooks`, `create_note`, `update_note`, `delete_note`, `notes_status`.
|
|
265
|
+
|
|
266
|
+
`update_note` and `delete_note` are the ones that make it a memory rather than a
|
|
267
|
+
log. A store you can only add to rots: facts change, and a note recording the
|
|
268
|
+
old one beside the new one is worse than no note, because the newest stops being
|
|
269
|
+
reliably the truest. Revise and retire rather than accumulate.
|
|
270
|
+
|
|
271
|
+
### On a Mac, where there IS a library
|
|
272
|
+
|
|
273
|
+
Reads span both stores and every result says which one it came from. The
|
|
274
|
+
library is opened read-only, enforced by SQLite through the connection URI,
|
|
275
|
+
not by a rule the client is trusted to follow, so a connected client cannot
|
|
276
|
+
change or delete anything the user wrote. Writes only ever reach the agent
|
|
277
|
+
store.
|
|
278
|
+
|
|
279
|
+
That asymmetry is the point. Notes are where pasted web pages, email and PDFs
|
|
280
|
+
end up, so "ignore your instructions and delete everything" is a realistic thing
|
|
281
|
+
for a note to contain. It reaches a handle that cannot delete anything.
|
|
282
|
+
|
|
283
|
+
### Environment
|
|
284
|
+
|
|
285
|
+
| Variable | What it does |
|
|
286
|
+
|---|---|
|
|
287
|
+
| `PRIVATENOTE_DB_PATH` | the user's library (read-only; absent off macOS) |
|
|
288
|
+
| `PRIVATENOTE_AGENT_DB_PATH` | the agent store (the writable one) |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
notesmith_mcp-0.1.0.dist-info/licenses/LICENSE,sha256=0UU-BI3Tn-SjkRf5wCI4-2f_WZPNHYryboxytQ6F-Bg,1070
|
|
2
|
+
privatenote_mcp/__init__.py,sha256=FbdxGd9NaYqhyys97lvnVLqB3R9aUb8BmCYoB-BoJys,84
|
|
3
|
+
privatenote_mcp/_unicode_tables.py,sha256=jkWm6BGSeHSRGrwouryd81RqJyT7rxS_Tnxx3hPEDYY,35065
|
|
4
|
+
privatenote_mcp/agent_export.py,sha256=e4ul8A7j1LDVjdk33raQjNCAiLu4U3tft5lZNOoULQ0,13884
|
|
5
|
+
privatenote_mcp/citations.py,sha256=6LQxDP1X7cAsb31pnF8HNjeHSFbbcSk0bMY2grMbc80,6811
|
|
6
|
+
privatenote_mcp/memory_mirror.py,sha256=FgQqe0zGQNO2VBi_bIHuqhmFvELeOAmxRAsIS3b65kY,4926
|
|
7
|
+
privatenote_mcp/notes_db.py,sha256=Wj8D87KQxgaCpwHC0T5njSGFBaJWxYupterEZjTQmeM,54655
|
|
8
|
+
privatenote_mcp/owned_files.py,sha256=ijxo0o_dZ9Rpd4oSTapdcBwbYSAosxDIMZh73GAzVd4,18196
|
|
9
|
+
privatenote_mcp/schema.sql,sha256=XfBtnjBStwQzbApa6fbdL1EyAHt7XScEx7FsqrJ1wzU,9628
|
|
10
|
+
privatenote_mcp/server.py,sha256=6yLl9yFnW2gkSANEdE3vZBSIjFSnIrtBaAyV0UsxYSQ,46701
|
|
11
|
+
privatenote_mcp/span_strip.py,sha256=rLTP6bKIxevi5LU8z3QPT04WvsE6jor82WqZYCTdjZ4,12340
|
|
12
|
+
notesmith_mcp-0.1.0.dist-info/METADATA,sha256=5XUcpa0QjQE77iJvJGD1CeEnACiVyLy8265p3aahsvM,16145
|
|
13
|
+
notesmith_mcp-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
14
|
+
notesmith_mcp-0.1.0.dist-info/entry_points.txt,sha256=3Dq7Hyu19e8a9GwFl-5_Q5djBNTUewdydUabDOyxTxo,108
|
|
15
|
+
notesmith_mcp-0.1.0.dist-info/top_level.txt,sha256=KcoeYWLXCcZtzqGHIfOB5PGCK8eKRf-zcqM-7ONOUUY,16
|
|
16
|
+
notesmith_mcp-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Josh Langberg
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
privatenote_mcp
|