CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 14s
CI & Build / TypeScript typecheck (push) Successful in 53s
CI & Build / integration (push) Successful in 1m2s
CI & Build / Python tests (push) Failing after 1m26s
CI & Build / Build & push image (push) Skipped
Step 3 of the Scribe -> Grimoire rename. - Plugin `grimoire` in marketplace `grimoire-plugin`, MCP server key `grimoire`, so tools reach a session as mcp__plugin_grimoire_grimoire__*. - hooks/scribe_* -> hooks/grimoire_*, their shell functions and the TMPDIR ledgers with them; SCRIBE_URL / SCRIBE_TOKEN / SCRIBE_HOOK_DIR / SCRIBE_LEDGER_DIRS -> GRIMOIRE_*; the project marker is `.grimoire`. - skills/using-scribe -> using-grimoire, /grimoire:sync, stored processes arrive as grimoire-proc-<slug>; moment_actions names them the same way. - Migration 0124 rewrites stored skill names (rule_moments, rule_moment_judgments, moment_mappings) from scribe:/scribe-proc- to grimoire:/grimoire-proc-, so a rule mounted on a skill keeps firing. - Settings' install commands and MCP-only defaults, the docs and the tests follow. - scripts/check_plugin.py drops the smoke event for a report-check hook that has no file in plugin/hooks. Kept on purpose: the secret-sealing label, and the names that let backups written as Scribe restore and be counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
115 lines
5.1 KiB
Markdown
115 lines
5.1 KiB
Markdown
# API Keys and Grimoire MCP
|
|
|
|
## API Keys
|
|
|
|
API keys let external tools access your Grimoire data without a browser session. Each key is scoped to a single user — it can only access data that user owns or has been shared with them.
|
|
|
|
### Scopes
|
|
|
|
| Scope | Permissions |
|
|
|-------|-------------|
|
|
| `read` | GET endpoints only — list, search, fetch content |
|
|
| `write` | Full read + create, update, delete |
|
|
|
|
Admin-level operations (log access, user management) require a `write`-scoped key from an admin account.
|
|
|
|
### Creating a Key
|
|
|
|
1. Go to **Settings → MCP Access**
|
|
2. Enter a name (e.g. "Claude MCP", "Home Server")
|
|
3. Choose scope
|
|
4. Click **Generate Key**
|
|
5. Copy the key immediately — it is shown only once (the token is `fmcp_`-prefixed)
|
|
|
|
Paste the key into the `Authorization: Bearer <key>` header of your MCP client
|
|
config (see **Grimoire MCP Server** below).
|
|
|
|
### Revoking a Key
|
|
|
|
Click **Revoke** next to the key in the keys table and confirm. Revoked keys are deleted immediately.
|
|
|
|
---
|
|
|
|
## Grimoire MCP Server
|
|
|
|
Grimoire exposes itself as a set of MCP tools that Claude (and other MCP clients)
|
|
can use to read and write your notes, tasks, projects, rulebooks, and more. The
|
|
server is **built into the app** — it is mounted as a streamable-HTTP endpoint
|
|
at **`/mcp`** on the running Grimoire instance (`src/grimoire/mcp/server.py`). There
|
|
is nothing to install: no wheel, no separate package, no CLI. You connect a
|
|
client straight to the URL with a Bearer token.
|
|
|
|
### Authentication
|
|
|
|
Authenticate with an API key generated from **Settings → MCP Access** (see above),
|
|
sent as `Authorization: Bearer fmcp_<key>`. A `read`-scoped key may call only the
|
|
read tools (`get_*`, `list_*`, `search`, `enter_project`, `retrieval_telemetry`);
|
|
any write/delete tool is rejected with `403`. The allow-list is explicit rather
|
|
than derived from the name — see `_READ_ONLY_TOOLS`, which is why the two reads
|
|
without a read-shaped name are spelled out here. A `write`-scoped key may call everything.
|
|
|
|
### Claude Code: the plugin (recommended)
|
|
|
|
The plugin connects the MCP server and adds the hooks and skills that put Grimoire's records in front of Claude as it works. Install it from this repo:
|
|
|
|
```
|
|
/plugin marketplace add https://git.fabledsword.com/bvandeusen/FabledScribe.git
|
|
/plugin install grimoire@grimoire-plugin
|
|
```
|
|
|
|
It asks for your Grimoire base URL, an API key (kept in your OS keychain) and, optionally, a project id. Settings → MCP Access shows the exact command for your instance. [`plugin/README.md`](../plugin/README.md) describes each hook.
|
|
|
|
### Claude Code without the plugin
|
|
|
|
Add a `.mcp.json` at the project root. The server `type` is `http` and the URL is
|
|
your instance's `/mcp` endpoint:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"grimoire": {
|
|
"type": "http",
|
|
"url": "https://your-grimoire-instance.example.com/mcp",
|
|
"headers": {
|
|
"Authorization": "Bearer fmcp_your-api-key"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Note: `.mcp.json` contains an API key and should be added to `.gitignore`.
|
|
|
|
### Claude Code (Global)
|
|
|
|
The same `mcpServers` block can live in `~/.claude.json` to make the server
|
|
available across all projects. A project-scoped `.mcp.json` takes precedence over
|
|
the global entry when both define the same server name — useful for pointing a
|
|
specific project at a dev instance or an admin key.
|
|
|
|
### Available Tools
|
|
|
|
There are well over a hundred tools and they change with the app, so the
|
|
registration in **`src/grimoire/mcp/tools/`** is the reference. By family:
|
|
|
|
| Family | Examples | Purpose |
|
|
|--------|----------|---------|
|
|
| Notes | `create_note`, `get_note`, `update_note`, `create_records` | Knowledge, and several records that cite each other in one call |
|
|
| Tasks | `create_task`, `update_task`, `add_task_log` | Work, issues and spikes, and their logs |
|
|
| Projects / Milestones | `enter_project`, `start_planning`, `get_milestone` | Projects and their plans |
|
|
| Search / Recall | `search`, `what_might_apply`, `get_recent` | Recall by meaning, and the rules that may apply to an act |
|
|
| Systems | `create_system`, `list_system_records`, `map_system_to_canonical` | A project's areas |
|
|
| Rules | `create_rule`, `create_project_rule`, `relate_rules`, `rule_history`, `list_moments` | Rules, preferences, their relations and moments |
|
|
| Lessons | `create_lesson`, `judge_lesson_link` | Lessons and the rules they instance |
|
|
| Snippets / Shapes | `create_snippet`, `verify_snippet`, `classify_shapes`, `list_shapes` | Prior art and the shape ledger |
|
|
| Design systems | `resolve_design_system`, `get_design_system_stylesheet` | Tokens and guidance for UI work |
|
|
| Family canon | `list_family_ideas`, `assess_family_adoption` | Ideas shared across projects |
|
|
| Processes | `list_processes`, `get_process`, `create_process` | Stored procedures |
|
|
| Retrieval | `retrieval_telemetry`, `tune_retrieval` | What was surfaced, and the thresholds |
|
|
| Trash | `list_trash`, `restore`, `purge_trash` | Recoverable deletes |
|
|
|
|
Server-level usage guidance — when to reach for each entity, the
|
|
recall-before-acting reflex, and the rulebook conventions — is delivered to the
|
|
client automatically via the MCP server's `instructions` block (defined in
|
|
`src/grimoire/mcp/server.py`).
|