docs: document Electron safeStorage token approach (v0.1.2)
- Version bump to 0.1.2 - Full authentication section: token types, lifetimes, resolution order - Setup instructions for plaud_decrypt_tokens.py - Token renewal date: 2026-11-25 - Decryption internals (Chromium v10 / AES-128-CBC / PBKDF2-SHA1) - Why OAuth route is blocked (no client_secret, Cloudflare blocks Node fetch) - Updated file structure with docs/ and runtime files - Changelog added
This commit is contained in:
1 parent
381142a6ac
commit
2235fa6401
1 file changed
+1
-70
@@ -1,70 +1 @@
|
|||||||
# plaud-mpm-plugin
|
IyBwbGF1ZC1tcG0tcGx1Z2luCgpDb25uZWN0cyBDbGF1ZGUgdG8gUGxhdWQgcmVjb3JkaW5ncyDigJQgbGlzdCwgc2VhcmNoLCB0cmFuc2NyaXB0cywgc3VtbWFyaWVzLCBhbmQgQUkgbm90ZXMgZGlyZWN0bHkgaW4gQ29Xb3JrLgoKKipWZXJzaW9uOioqIDAuMS4yCioqQXV0aG9yOioqIE1lc3NhZ2UgUG9pbnQgTWVkaWEKKipSZXBvOioqIGh0dHBzOi8vZ2l0LmFsd2lzcC5jb20vamFzb24vcGxhdWQtbXBtLXBsdWdpbgoqKkNvV29yayBQcm9qZWN0OioqIENXLTAxMiDigJQgUGxhdWQgTUNQIFBsdWdpbgoKLS0tCgojIyBPdmVydmlldwoKVGhpcyBDb1dvcmsgcGx1Z2luIGdpdmVzIENsYXVkZSBkaXJlY3QgYWNjZXNzIHRvIEJyeWFuJ3MgUGxhdWQgdm9pY2UgcmVjb3JkaW5ncyB2aWEgdGhlIHVub2ZmaWNpYWwgUGxhdWQgQVBJLiBJdCBleHBvc2VzIDcgTUNQIHRvb2xzIGNvdmVyaW5nIGxpc3RpbmcsIHNlYXJjaGluZywgdHJhbnNjcmlwdHMsIHN1bW1hcmllcywgYW5kIEFJLWdlbmVyYXRlZCBub3Rlcy4gVGhlIHBsdWdpbiBydW5zIGFzIGEgUHl0aG9uIEZhc3RNQ1Agc3RkaW8gc2VydmVyIGxhdW5jaGVkIGJ5IGB1dmAg4oCUIG5vIGFkZGl0aW9uYWwgcnVudGltZSBkZXBlbmRlbmNpZXMgYmV5b25kIGBtY3BbY2xpXWAuCgpBdXRoZW50aWNhdGlvbiB1c2VzIHRoZSBQbGF1ZCBkZXNrdG9wIGFwcCdzIGxvbmctbGl2ZWQgYGF1dGhUb2tlbmAgSldUICh+NiBtb250aHMpLCBleHRyYWN0ZWQgZnJvbSBFbGVjdHJvbiBzYWZlU3RvcmFnZSB2aWEgYHBsYXVkX2RlY3J5cHRfdG9rZW5zLnB5YC4gTm8gbWFudWFsIHRva2VuIGh1bnRpbmcgaW4gYnJvd3NlciBEZXZUb29scyByZXF1aXJlZC4KCi0tLQoKIyMgQXV0aGVudGljYXRpb24KCiMjIyBIb3cgaXQgd29ya3MKClRoZSBQbGF1ZCBkZXNrdG9wIGFwcCBzdG9yZXMgdGhyZWUgdG9rZW4gdHlwZXMgaW4gQ2hyb21pdW0gdjEwIEVsZWN0cm9uIHNhZmVTdG9yYWdlIChgfi9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvUGxhdWQvZW5jcnlwdGlvbi5qc29uYCk6Cgp8IFRva2VuIHwgVHlwZSB8IExpZmV0aW1lIHwgVXNlZCBmb3IgfAp8LS0tfC0tLXwtLS18LS0tfAp8IGBhdXRoVG9rZW5gIHwgU3RhbmRhcmQgSldUIHwgKip+NiBtb250aHMqKiB8IOKchSBBUEkgY2FsbHMgKGBhcGkucGxhdWQuYWlgKSB8CnwgYHd0VG9rZW5gIHwgUGxhdWQgV0pUIHwgfjI0IGhvdXJzIHwgSW50ZXJuYWwgd2ViIHNlc3Npb25zIG9ubHkgfAp8IGB3cnRUb2tlbmAgfCBQbGF1ZCBXUlQgfCB+MzAgZGF5cyB8IFdvcmtzcGFjZSByZWZyZXNoIChub3QgT0F1dGgtY29tcGF0aWJsZSkgfAoKVGhlIE1DUCBzZXJ2ZXIgcmVhZHMgYGF1dGhUb2tlbmAg4oCUIHRoZSBvbmx5IHRva2VuIHRoYXQgd29ya3Mgd2l0aCB0aGUgQVBJIGxvbmctdGVybS4KCiMjIyBUb2tlbiByZXNvbHV0aW9uIG9yZGVyCgpgcGxhdWRfbWNwLnB5YCBjaGVja3MgY3JlZGVudGlhbHMgaW4gdGhpcyBwcmlvcml0eToKCjEuIGBQTEFVRF9UT0tFTmAgZW52aXJvbm1lbnQgdmFyaWFibGUgKG1hbnVhbCBvdmVycmlkZSkKMi4gYH4vLnBsYXVkL3Rva2Vucy1tY3AuanNvbmAg4oaSIGBhY2Nlc3NfdG9rZW5gIGZpZWxkIOKGkCAqKnByaW1hcnk7IH42LW1vbnRoIGxpZmV0aW1lKioKMy4gYH4vLnBsYXVkL2NvbmZpZy5qc29uYCDihpIgYHRva2VuLnRva2VuYCBmaWVsZCAobGVnYWN5IGZhbGxiYWNrKQoKIyMjIFNldHVwIOKAlCBvbmUtdGltZSB0b2tlbiBleHRyYWN0aW9uCgpgcGxhdWRfZGVjcnlwdF90b2tlbnMucHlgIChzYXZlZCBpbiB5b3VyIENsYXVkZSBDb1dvcmsgZm9sZGVyKSBkZWNyeXB0cyB0aGUgZGVza3RvcCBhcHAgdG9rZW5zIHVzaW5nIHRoZSBtYWNPUyBLZXljaGFpbiBwYXNzd29yZCBhbmQgc2F2ZXMgdGhlbSB0byBgfi8ucGxhdWQvdG9rZW5zLW1jcC5qc29uYC4KCioqUHJlcmVxdWlzaXRlczoqKiBQbGF1ZCBkZXNrdG9wIGFwcCBpbnN0YWxsZWQgYW5kIGxvZ2dlZCBpbi4gUHl0aG9uICsgYHB5Y3J5cHRvZG9tZWAuCgpgYGBiYXNoCiMgSW5zdGFsbCBjcnlwdG8gbGlicmFyeSAoZmlyc3QgdGltZSBvbmx5KQpwaXAgaW5zdGFsbCBweWNyeXB0b2RvbWUKCiMgUnVuIGZyb20gQ2xhdWRlIENvV29yayBmb2xkZXIKcHl0aG9uMyBwbGF1ZF9kZWNyeXB0X3Rva2Vucy5weQpgYGAKCkV4cGVjdGVkIG91dHB1dDoKYGBgCmF1dGhUb2tlbiBleHBpcmVzIDogMjAyNi0xMS0yNQrinJMgQVBJIHRlc3QgcGFzc2VkIOKAlCA1IHNlc3Npb25zIGZvdW5kLgrinJMgU2F2ZWQgdG8gL1VzZXJzLzx5b3U+Ly5wbGF1ZC90b2tlbnMtbWNwLmpzb24KICBOZXh0IHJlbmV3YWw6IDIwMjYtMTEtMjUKYGBgCgojIyMgVG9rZW4gcmVuZXdhbAoKKipOZXh0IHJlbmV3YWwgZGF0ZTogMjAyNi0xMS0yNSoqCgpXaGVuIHRoZSB0b2tlbiBleHBpcmVzLCByZS1ydW4gYHBsYXVkX2RlY3J5cHRfdG9rZW5zLnB5YCBmcm9tIHRoZSBDbGF1ZGUgQ29Xb3JrIGZvbGRlci4gVGhlIHNjcmlwdCB3aWxsIHJlLWRlY3J5cHQgdGhlIGRlc2t0b3AgYXBwJ3MgcmVmcmVzaGVkIHRva2VuIGFuZCBvdmVyd3JpdGUgYHRva2Vucy1tY3AuanNvbmAgYXV0b21hdGljYWxseS4KCiMjIyBIb3cgdGhlIGRlY3J5cHRpb24gd29ya3MgKHRlY2huaWNhbCkKCkVsZWN0cm9uIHNhZmVTdG9yYWdlIG9uIG1hY09TIHVzZXMgQ2hyb21pdW0ncyB2MTAgZm9ybWF0OgotIEVuY3J5cHRpb246IEFFUy0xMjgtQ0JDCi0gS2V5IGRlcml2YXRpb246IFBCS0RGMi1TSEExKGBrZXljaGFpbl9wYXNzd29yZGAsIHNhbHQ9YHNhbHR5c2FsdGAsIGl0ZXJhdGlvbnM9MTAwMywga2V5X2xlbj0xNikKLSBJVjogMTYgc3BhY2UgYnl0ZXMKLSBDaXBoZXJ0ZXh0OiBiYXNlNjQtZW5jb2RlZCwgcHJlZml4ZWQgd2l0aCBgdjEwYAotIEtleWNoYWluIHNlcnZpY2U6IGAiUGxhdWQgU2FmZSBTdG9yYWdlImAKClRoZSBgYXV0aFRva2VuYCBmaWVsZCBkZWNyeXB0cyB0byBhIHN0YW5kYXJkIGAiYmVhcmVyIGV5Si4uLiJgIEpXVC4gVGhlIHNjcmlwdCBzdHJpcHMgdGhlIHByZWZpeCBhbmQgc2F2ZXMgdGhlIHJhdyBKV1QgYXMgYGFjY2Vzc190b2tlbmAgaW4gYHRva2Vucy1tY3AuanNvbmAuCgojIyMgV2h5IG5vdCBPQXV0aD8KClRoZSBQbGF1ZCBDTEkncyBPQXV0aCBmbG93IChgcGxhdGZvcm0ucGxhdWQuYWkvZGV2ZWxvcGVyL2FwaS9vYXV0aGApIHJlcXVpcmVzIGEgY2xpZW50IHNlY3JldCB0aGF0IGlzIG5vdCBidW5kbGVkIGluIHRoZSBvcGVuLXNvdXJjZSBjb25uZWN0b3IgcGFja2FnZS4gTm9kZS5qcyBgZmV0Y2goKWAgaXMgYWxzbyBibG9ja2VkIGJ5IENsb3VkZmxhcmUgb24gYHBsYXRmb3JtLnBsYXVkLmFpYC4gVGhlIEVsZWN0cm9uIHNhZmVTdG9yYWdlIGFwcHJvYWNoIGlzIG1vcmUgcmVsaWFibGUgYW5kIGxvbmdlci1saXZlZC4KCi0tLQoKIyMgTUNQIFRvb2xzICg3KQoKfCBUb29sIHwgRGVzY3JpcHRpb24gfAp8LS0tfC0tLXwKfCBgcGxhdWRfbGlzdF9yZWNvcmRpbmdzYCB8IExpc3QgYWxsIHJlY29yZGluZ3MgbmV3ZXN0LWZpcnN0LiBQYXJhbXM6IGBsaW1pdGAsIGBvbmx5X3dpdGhfdHJhbnNjcmlwdGAuIHwKfCBgcGxhdWRfc2VhcmNoX3JlY29yZGluZ3NgIHwgRmlsdGVyIGJ5IGB0aXRsZV9jb250YWluc2AsIGBzdGFydF9kYXRlYCwgYGVuZF9kYXRlYCwgYG9ubHlfd2l0aF90cmFuc2NyaXB0YC4gfAp8IGBwbGF1ZF9nZXRfdHJhbnNjcmlwdGAgfCBGdWxsIHRyYW5zY3JpcHQgdGV4dCBmb3IgYSByZWNvcmRpbmcgSUQuIHwKfCBgcGxhdWRfZ2V0X3N1bW1Line truncated
|
||||||
|
|
||||||
Connects Claude to Plaud recordings — list, search, transcripts, summaries, and AI notes directly in CoWork.
|
|
||||||
|
|
||||||
**Version:** 0.1.0
|
|
||||||
**Author:** Message Point Media
|
|
||||||
**Repo:** https://git.alwisp.com/jason/plaud-mpm-plugin
|
|
||||||
**CoWork Project:** CW-012 — Plaud MCP Plugin
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
This CoWork plugin gives Claude direct access to Bryan's Plaud voice recordings via the unofficial Plaud API. It authenticates using a bearer token stored in `~/.plaud/config.json` (written by the plaud-connector `import-token` command) and exposes 7 MCP tools covering listing, searching, transcripts, summaries, and AI-generated notes. The plugin runs as a Python FastMCP stdio server launched by `uv` — no additional runtime dependencies beyond `mcp[cli]`.
|
|
||||||
|
|
||||||
## Authentication
|
|
||||||
|
|
||||||
Token is read from `~/.plaud/config.json` → `token.token` field (plaud-connector format).
|
|
||||||
Falls back to `PLAUD_TOKEN` environment variable.
|
|
||||||
|
|
||||||
**Token setup (one-time):**
|
|
||||||
```bash
|
|
||||||
npx tsx ~/Developer/plaud-connector/packages/cli/bin/plaud.ts import-token app "<jwt>"
|
|
||||||
```
|
|
||||||
|
|
||||||
Get the JWT from Chrome DevTools → Network → any `api.plaud.ai` request → `Authorization: Bearer <token>`.
|
|
||||||
Tokens last ~300 days. Re-run `import-token` when expired.
|
|
||||||
|
|
||||||
## MCP Tools (7)
|
|
||||||
|
|
||||||
| Tool | Description |
|
|
||||||
|---|---|
|
|
||||||
| `plaud_list_recordings` | List all recordings newest-first. Params: `limit`, `only_with_transcript`. |
|
|
||||||
| `plaud_search_recordings` | Filter by `title_contains`, `start_date`, `end_date`, `only_with_transcript`. |
|
|
||||||
| `plaud_get_transcript` | Full transcript text for a recording ID. |
|
|
||||||
| `plaud_get_summary` | AI-generated summary for a recording ID. |
|
|
||||||
| `plaud_get_notes` | AI notes and action items (content_list) for a recording ID. |
|
|
||||||
| `plaud_get_recording_detail` | Full metadata: title, date, duration, flags, language, device, tags. |
|
|
||||||
| `plaud_user_info` | Account info and connection status. |
|
|
||||||
|
|
||||||
## Skills
|
|
||||||
|
|
||||||
| Skill | Trigger phrases |
|
|
||||||
|---|---|
|
|
||||||
| `plaud` | "pull the transcript", "what was discussed in my last meeting", "search my Plaud recordings", "show me action items from [meeting]", "meeting transcript", "meeting summary", "voice notes" |
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
- `mcp[cli]` (via `uv run --with mcp[cli]`) — FastMCP server framework
|
|
||||||
- `plaud-connector` (external, for auth setup only) — https://github.com/rggnkmp/plaud-connector
|
|
||||||
- Python stdlib only for HTTP (`urllib.request`)
|
|
||||||
|
|
||||||
## Region
|
|
||||||
|
|
||||||
US region (`api.plaud.ai`). Set `PLAUD_REGION=eu` env var to switch to EU (`api.plaud.eu`).
|
|
||||||
|
|
||||||
## File Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
plaud-mpm-plugin/
|
|
||||||
├── .claude-plugin/
|
|
||||||
│ └── plugin.json # Plugin metadata
|
|
||||||
├── .mcp.json # MCP server config (uv + plaud_mcp.py)
|
|
||||||
├── server/
|
|
||||||
│ └── plaud_mcp.py # FastMCP server — 7 tools
|
|
||||||
├── skills/
|
|
||||||
│ └── plaud/
|
|
||||||
│ └── SKILL.md # Skill definition and workflow guidance
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
Reference in new issue
Block a user