MCP Server
Model Context Protocol server for AI agent integration.
Fortémi MCP Server
Complete documentation for the Model Context Protocol (MCP) server that provides AI agent access to Fortémi.
Connecting to Fortémi
Remote Access (Recommended)
Add this to your project's `.mcp.json`:
{
"mcpServers": {
"fortemi": {
"url": "http://localhost:3001"
}
}
}
On first connection, your MCP client will perform an OAuth2 authentication flow. No manual credential setup is needed — the server handles credential management automatically.
Requirements:
- `ISSUER_URL` must be set in your `.env` to the hosted public HTTPS deployment domain; local HTTP testing also requires `FORTEMI_ALLOW_LOCAL_ISSUER=true`
- For remote access, configure nginx to proxy `/mcp` to port 3001
Local Access (Development)
For local development with the source code:
{
"mcpServers": {
"fortemi": {
"command": "node",
"args": ["./mcp-server/index.js"],
"env": {
"FORTEMI_URL": "http://localhost:3000"
}
}
}
}
Local (stdio) transport requires no authentication.
How Authentication Works
The MCP server uses OAuth2 for secure access:
1. Your MCP client connects and discovers the OAuth server via `.well-known` endpoints 2. The client authenticates and receives a bearer token 3. Every MCP request includes this token 4. The MCP server validates the token against the API's introspection endpoint
Credentials are managed automatically. The Docker bundle registers its own OAuth client on startup and persists the credentials. You never need to manually configure `MCP_CLIENT_ID` or `MCP_CLIENT_SECRET` unless you want explicit control.
For advanced credential management, security considerations, and manual configuration, see the MCP Deployment Guide.
Overview
The MCP server provides AI assistants (Claude, etc.) with access to your knowledge base through two distinct tool surfaces:
Core Mode (Default)
45 consolidated tools using discriminated-union pattern for agent-optimized operation:
- ~58% serialized schema reduction compared to full mode (45 vs 207 tools)
- Action-based design groups related operations under unified tools
- Cognitive load reduction improves agent decision-making and response time
- Backward compatible all functionality available, just organized differently
Full Mode (Optional)
207 tools exposing the consolidated and granular API surface:
- Set `MCP_TOOL_MODE=full` environment variable
- Useful for programmatic access requiring precise endpoint control
- Higher token overhead and cognitive complexity for agents
Recommendation: Use default core mode unless you have specific requirements for granular tool access.
Core Tools Reference
The 45 core tools provide complete access to Fortémi functionality through action-based interfaces.
Notes Operations
`list_notes`
List notes with filtering and pagination.
Parameters:
- `limit` (optional) - Maximum number of notes to return (default: 50, max: 1000)
- `offset` (optional) - Number of notes to skip (default: 0)
- `tags` (optional) - Filter by tags (array of strings)
- `collection_id` (optional) - Filter by collection UUID
- `deleted` (optional) - Include soft-deleted notes (default: false)
{
"limit": 20,
"tags": ["research", "ai"],
"collection_id": "550e8400-e29b-41d4-a716-446655440000"
}
`get_note`
Retrieve full details for a specific note by ID.
Parameters:
- `id` (required) - UUID of the note
{
"id": "550e8400-e29b-41d4-a716-446655440000"
}
`upsert_external_notes`
Atomically persists externally managed notes by source namespace and external ID. Supply a stable `import_run_id`; optionally supply `batch_id` and a resumable `checkpoint`. Exact batch replay returns `duplicate` without adding notes, revisions, activity, jobs, blobs, outbox records, or journal rows.
Changed content defaults to `version`. Use `replace` to update managed content without a new revision, or `conflict` to report the difference without mutation. Set `dry_run` to preview all item outcomes. The response contains opaque external-key hashes and content digests, never raw external IDs or content.
{
"source_namespace": "example.sync",
"source_schema_version": "1",
"import_run_id": "run-2026-09-03",
"batch_id": "page-0001",
"checkpoint": {"cursor": "next-page"},
"policy": "version",
"items": [
{
"external_id": "record-42",
"content": "Managed note content",
"metadata": {"source_type": "example"}
}
]
}
`manage_dataset_execution`
The capability response advertises receipt validation and request binding revision `1.0.1`. Discover this revision before approving a preview digest. Input/output schema digests participate in the request identity; changing either requires new approval and cannot reuse an existing run's idempotency identity. Strict schemas and executable count/digest checks apply even to freshly checksummed receipts. Historical receipts remain readable, but legacy cross-release replay is not qualified by this revision.
Exposes the versioned Dataset Intelligence execution adapter. `capabilities` returns the alpha live-server descriptor and supported contract/profile revisions. `preview` performs pure fail-closed negotiation and resource checks. `execute` requires a fresh UUID dataset namespace and delegates one bounded atomic upsert batch to the durable source journal. `status`, `checkpoint`, `cancel`, `resume`, `retry`, `verify`, and `archive` complete the lifecycle. Resume is an explicit alias for exact-content retry. Archive shares the negotiated duration and single-operation concurrency bound and reports hashed unresolved residue if its cleanup deadline expires.
Once a batch is submitted, connection failures and incomplete or inconsistent storage responses leave the attempt `ambiguous`/`unverifiable`: transport failure does not prove that storage rolled back. Retry the stored exact request to resolve its durable outcome. `checkpoint` returns the after-checkpoint only for verified `committed`/`degraded` attempts. `archive` rejects an ambiguous attempt with `RUN_OUTCOME_UNRESOLVED` until exact retry resolves it. These lifecycle diagnostics are distinct from the HTTP API's RFC 9457 error response contract.
The compact MCP schema accepts the canonical request under `request`; the full language-neutral schema and fixtures are published under `contracts/dataset-execution/1.0.0`, with current strict validation and request binding under `contracts/dataset-execution/validation/1.0.1`. Receipts bind plan/configuration/input/ output schema digests, negotiation, resource envelope, checkpoint, profiles, counts, outcomes, and diagnostics. They contain no source content, raw logical IDs, or connection details.
{
"action": "preview",
"runId": "018fd1a0-0000-7000-8000-000000001129",
"request": {
"contractVersions": {
"capability": "fortemi.dataset-execution-capabilities/v1",
"plan": "fortemi.dataset-ingest/v1",
"checkpoint": "fortemi.dataset-ingest/v1",
"lineage": "fortemi.dataset-lineage/v1",
"materialization": "fortemi.dataset-materialization-profile/v1",
"receipt": "fortemi.dataset-run-receipt/v1",
"resourceEnvelope": "fortemi.dataset-resource-envelope/v1"
},
"schemaVersions": {
"capability": "1.0.0",
"plan": "1.0.0",
"checkpoint": "1.0.0",
"lineage": "1.0.0",
"materialization": "1.0.0",
"receipt": "1.0.0",
"resourceEnvelope": "1.0.0"
}
}
}
Use the complete positive request fixture as the executable example. Preview and detached receipt verification never call the REST API. An in-flight cancel is reported as `ambiguous` because transport interruption cannot prove whether the underlying transaction committed; exact retry resolves the outcome through the durable source-upsert journal. The current profile is lexical/source- identity only and does not claim graph, community, rerank, tenant/RLS, backup, recovery, load, Knowledge Shard, or broad portability parity.
`update_note`
Update note content, title, or status.
Parameters:
- `id` (required) - UUID of the note
- `content` (optional) - New markdown content
- `title` (optional) - New title
- `status` (optional) - New status (active, archived, etc.)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"content": "# Updated content\
\
New information...",
"status": "active"
}
`delete_note`
Soft delete a note (recoverable via `restore_note`).
Parameters:
- `id` (required) - UUID of the note
{
"id": "550e8400-e29b-41d4-a716-446655440000"
}
`restore_note`
Restore a soft-deleted note with all original metadata, tags, and content.
Parameters:
- `id` (required) - UUID of the deleted note
{
"id": "550e8400-e29b-41d4-a716-446655440000"
}
`capture_knowledge`
Unified tool for creating notes and uploading content. Each note automatically enters the two-phase NLP pipeline:
- Phase 1 (parallel): AI revision, title generation, SKOS concept tagging (8-15 tags), metadata extraction, document type inference
- Phase 2 (after tagging): Tag-enriched embedding generation, tag-boosted semantic linking
Set `revision_mode: "none"` to skip AI revision but still get auto-tagging, embeddings, and linking.
Actions:
`create` - Create a single note
Creates a note and triggers the full NLP pipeline. No manual tagging needed — the system generates SKOS concept tags automatically.
Revision Modes:
| Mode | Use When | Behavior |
|---|---|---|
| `light` (default) | Facts, opinions, quick thoughts | Formatting only, no invented details |
| `full` | Technical concepts, research | Full contextual expansion with related notes |
| `none` | Exact quotes, citations, raw data | No AI processing, auto-queuing disabled |
Parameters:
- `action: "create"`
- `content` (required) - Markdown content
- `tags` (optional) - Array of tag strings
- `revision_mode` (optional) - "light" (default), "full", or "none"
- `collection_id` (optional) - UUID to assign note to collection
{
"action": "create",
"content": "# Research Note\
\
Transformer architecture details...",
"tags": ["research", "ai", "transformers"],
"revision_mode": "light",
"collection_id": "550e8400-e29b-41d4-a716-446655440000"
}
`bulk_create` - Create multiple notes at once
Batch create up to 100 notes in a single operation.
Parameters:
- `action: "bulk_create"`
- `notes` (required) - Array of note objects (max 100)
{
"action": "bulk_create",
"notes": [
{
"content": "# Note 1",
"tags": ["batch"],
"revision_mode": "light"
},
{
"content": "# Note 2",
"tags": ["batch"],
"revision_mode": "light"
}
]
}
`from_template` - Create note from template
Instantiate a template with variable substitution.
Parameters:
- `action: "from_template"`
- `template_id` (required) - UUID of the template
- `variables` (required) - Object with variable values (e.g., `{"title": "My Title"}`)
- `tags` (optional) - Additional tags beyond template defaults
{
"action": "from_template",
"template_id": "660e8400-e29b-41d4-a716-446655440000",
"variables": {
"title": "Meeting Notes",
"date": "2026-02-14",
"attendees": "Alice, Bob"
},
"tags": ["meeting"]
}
`upload` - Upload file attachment to note
Upload a file from disk with automatic metadata extraction.
Parameters:
- `action: "upload"`
- `note_id` (required) - UUID of the note
- `file_path` (required) - Absolute path to file on disk
- `content_type` (required) - MIME type (e.g., "image/jpeg")
- `filename` (optional) - Override filename (defaults to basename)
{
"action": "upload",
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"file_path": "/home/user/photos/diagram.png",
"content_type": "image/png"
}
`search`
Unified search tool supporting text, spatial, temporal, and federated search modes.
Actions:
`text` - Hybrid semantic + full-text search
Combines keyword matching and semantic similarity for comprehensive search.
Search Modes:
- `hybrid` (default) - Combines keyword + semantic
- `fts` - Exact keyword matching only
- `semantic` - Conceptual similarity only
Parameters:
- `action: "text"`
- `query` (required) - Search query string
- `mode` (optional) - "hybrid", "fts", or "semantic"
- `limit` (optional) - Max results (default: 50)
- `offset` (optional) - Skip N results (default: 0)
- `set` (optional) - Embedding set slug to search within
- `collection_id` (optional) - Restrict to collection
- `strict_filter` (optional) - Tag-based filtering object
Query Syntax:
hello world # Match all words (AND)
apple OR orange # Match either word
apple -orange # Exclude word
"hello world" # Match exact phrase
Strict Filtering:
{
"action": "text",
"query": "authentication",
"strict_filter": {
"required_tags": ["project:matric"],
"excluded_tags": ["draft", "archived"],
"any_tags": ["status:active", "status:review"],
"required_schemes": ["client-acme"],
"excluded_schemes": ["internal"]
}
}
Filter Types:
| Parameter | Logic | Description |
|---|---|---|
| `required_tags` | AND | Notes MUST have ALL these tags |
| `any_tags` | OR | Notes MUST have AT LEAST ONE |
| `excluded_tags` | NOT | Notes MUST NOT have ANY of these |
| `required_schemes` | Isolation | Notes ONLY from these vocabularies |
| `excluded_schemes` | Exclusion | Notes NOT from these vocabularies |
`spatial` - Search by geographic location
Find memories near coordinates using PostGIS spatial queries.
Parameters:
- `action: "spatial"`
- `latitude` (required) - Latitude in degrees
- `longitude` (required) - Longitude in degrees
- `radius_km` (optional) - Search radius in kilometers (default: 10)
- `limit` (optional) - Max results (default: 50)
{
"action": "spatial",
"latitude": 37.7749,
"longitude": -122.4194,
"radius_km": 5.0,
"limit": 20
}
`temporal` - Search by time range
Find memories within a specific time period.
Parameters:
- `action: "temporal"`
- `start_time` (required) - ISO 8601 timestamp
- `end_time` (required) - ISO 8601 timestamp
- `limit` (optional) - Max results (default: 50)
{
"action": "temporal",
"start_time": "2026-01-01T00:00:00Z",
"end_time": "2026-01-31T23:59:59Z",
"limit": 50
}
`spatial_temporal` - Combined location and time search
Find memories matching both location and time criteria.
Parameters:
- `action: "spatial_temporal"`
- `latitude` (required) - Latitude in degrees
- `longitude` (required) - Longitude in degrees
- `radius_km` (required) - Search radius in kilometers
- `start_time` (required) - ISO 8601 timestamp
- `end_time` (required) - ISO 8601 timestamp
- `limit` (optional) - Max results (default: 50)
{
"action": "spatial_temporal",
"latitude": 37.7749,
"longitude": -122.4194,
"radius_km": 2.0,
"start_time": "2026-02-01T00:00:00Z",
"end_time": "2026-02-14T23:59:59Z"
}
`federated` - Search across multiple memory archives
Search across all memories or a specific set simultaneously.
Parameters:
- `action: "federated"`
- `query` (required) - Search query string
- `memories` (optional) - Array of memory names, or `["all"]` (default: all)
- `mode` (optional) - "hybrid", "fts", or "semantic" (default: "hybrid")
- `limit` (optional) - Max results per memory (default: 50)
{
"action": "federated",
"query": "project documentation",
"memories": ["work", "research", "personal"],
"mode": "hybrid",
"limit": 20
}
`record_provenance`
Create spatial-temporal provenance records for notes, files, locations, and devices.
Actions:
`location` - Record anonymous location
Create a provenance location without a named place.
Parameters:
- `action: "location"`
- `latitude` (required) - Latitude in degrees
- `longitude` (required) - Longitude in degrees
- `accuracy_meters` (optional) - GPS accuracy
- `altitude_meters` (optional) - Altitude above sea level
- `created_at` (optional) - ISO 8601 timestamp (defaults to now)
{
"action": "location",
"latitude": 37.7749,
"longitude": -122.4194,
"accuracy_meters": 10.0,
"altitude_meters": 15.0
}
`named_location` - Record named location
Create a location with a human-readable name.
Parameters:
- `action: "named_location"`
- `name` (required) - Location name
- `latitude` (required) - Latitude in degrees
- `longitude` (required) - Longitude in degrees
- `place_type` (optional) - Type of place (e.g., "office", "cafe")
- `accuracy_meters` (optional) - GPS accuracy
{
"action": "named_location",
"name": "San Francisco Office",
"latitude": 37.7749,
"longitude": -122.4194,
"place_type": "office"
}
`device` - Record device provenance
Track which device created or modified content.
Parameters:
- `action: "device"`
- `device_id` (required) - Unique device identifier
- `name` (optional) - Human-readable device name
- `device_type` (optional) - Type (e.g., "laptop", "phone")
- `os` (optional) - Operating system
- `app_version` (optional) - Application version
{
"action": "device",
"device_id": "macbook-pro-2023",
"name": "Work Laptop",
"device_type": "laptop",
"os": "macOS 14.0"
}
`file` - Record file provenance
Track file origins and metadata.
Parameters:
- `action: "file"`
- `filename` (required) - File name
- `file_path` (optional) - Full path
- `mime_type` (optional) - MIME type
- `size_bytes` (optional) - File size
- `sha256` (optional) - File hash
- `created_at` (optional) - ISO 8601 timestamp
{
"action": "file",
"filename": "research-paper.pdf",
"file_path": "/documents/research-paper.pdf",
"mime_type": "application/pdf",
"size_bytes": 2048576
}
`note` - Record note-level provenance
Associate spatial-temporal provenance with a note.
Parameters:
- `action: "note"`
- `note_id` (required) - UUID of the note
- `location_id` (optional) - UUID of provenance location
- `device_id` (optional) - UUID of provenance device
- `recorded_at` (optional) - ISO 8601 timestamp (defaults to now)
{
"action": "note",
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"location_id": "660e8400-e29b-41d4-a716-446655440001",
"device_id": "770e8400-e29b-41d4-a716-446655440002"
}
`manage_tags`
Tag curation and review. Since the NLP pipeline automatically generates SKOS concept tags for every note, this tool is primarily for reviewing auto-tags, making corrections, and adding organizational tags that can't be inferred from content (project names, status markers, scope).
Actions:
`list` - List all tags with usage counts
Parameters:
- `action: "list"`
- `limit` (optional) - Max results (default: 100)
- `offset` (optional) - Skip N results (default: 0)
- `min_count` (optional) - Minimum usage count (default: 1)
{
"action": "list",
"limit": 50,
"min_count": 5
}
`set` - Replace note's user tags
Sets the complete tag list for a note (replaces existing tags).
Parameters:
- `action: "set"`
- `note_id` (required) - UUID of the note
- `tags` (required) - Array of tag strings
{
"action": "set",
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"tags": ["research", "ai", "transformers"]
}
`tag_concept` - Tag note with SKOS concept
Apply hierarchical semantic tag from concept scheme.
Parameters:
- `action: "tag_concept"`
- `note_id` (required) - UUID of the note
- `concept_id` (required) - UUID of the SKOS concept
{
"action": "tag_concept",
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"concept_id": "880e8400-e29b-41d4-a716-446655440000"
}
`untag_concept` - Remove SKOS concept tag
Remove hierarchical semantic tag from note.
Parameters:
- `action: "untag_concept"`
- `note_id` (required) - UUID of the note
- `concept_id` (required) - UUID of the SKOS concept
{
"action": "untag_concept",
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"concept_id": "880e8400-e29b-41d4-a716-446655440000"
}
`get_concepts` - Get note's SKOS concepts
Retrieve all SKOS concept tags applied to a note.
Parameters:
- `action: "get_concepts"`
- `note_id` (required) - UUID of the note
{
"action": "get_concepts",
"note_id": "550e8400-e29b-41d4-a716-446655440000"
}
`manage_collection`
Hierarchical folder organization for notes.
Actions:
`list` - List collections with optional parent filter
Parameters:
- `action: "list"`
- `parent_id` (optional) - UUID of parent collection (null for root)
- `limit` (optional) - Max results (default: 100)
{
"action": "list",
"parent_id": "550e8400-e29b-41d4-a716-446655440000",
"limit": 50
}
`create` - Create new collection
Parameters:
- `action: "create"`
- `name` (required) - Collection name
- `description` (optional) - Description
- `parent_id` (optional) - UUID of parent collection (null for root)
{
"action": "create",
"name": "Research Projects",
"description": "Active research work",
"parent_id": null
}
`get` - Get collection details
Parameters:
- `action: "get"`
- `id` (required) - UUID of the collection
{
"action": "get",
"id": "550e8400-e29b-41d4-a716-446655440000"
}
`update` - Update collection metadata or hierarchy
Change name, description, or parent to reorganize collections.
Parameters:
- `action: "update"`
- `id` (required) - UUID of the collection
- `name` (optional) - New name
- `description` (optional) - New description
- `parent_id` (optional) - New parent UUID (null to move to root)
{
"action": "update",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "AI Research 2026",
"parent_id": "660e8400-e29b-41d4-a716-446655440001"
}
`delete` - Delete collection
Soft delete collection (does not delete notes within).
Parameters:
- `action: "delete"`
- `id` (required) - UUID of the collection
{
"action": "delete",
"id": "550e8400-e29b-41d4-a716-446655440000"
}
`list_notes` - List notes in collection
Parameters:
- `action: "list_notes"`
- `id` (required) - UUID of the collection
- `limit` (optional) - Max results (default: 50)
- `offset` (optional) - Skip N results (default: 0)
{
"action": "list_notes",
"id": "550e8400-e29b-41d4-a716-446655440000",
"limit": 20
}
`move_note` - Move note to collection
Parameters:
- `action: "move_note"`
- `note_id` (required) - UUID of the note
- `collection_id` (required) - UUID of the target collection (null to remove from all)
{
"action": "move_note",
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"collection_id": "660e8400-e29b-41d4-a716-446655440001"
}
`export` - Export collection as JSON
Export collection with all notes, metadata, and structure.
Parameters:
- `action: "export"`
- `id` (required) - UUID of the collection
- `include_notes` (optional) - Include note content (default: true)
{
"action": "export",
"id": "550e8400-e29b-41d4-a716-446655440000",
"include_notes": true
}
`manage_concepts`
SKOS vocabulary governance, exploration, and scheme management. The concept vocabulary grows automatically as the NLP pipeline tags notes — this tool is for searching, reviewing, and curating that vocabulary, as well as managing concept schemes (taxonomies).
Actions:
`search` - Search concepts by label or definition
Parameters:
- `action: "search"`
- `query` (required) - Search query string
- `scheme_id` (optional) - Restrict to specific scheme UUID
- `status` (optional) - Filter by status ("candidate", "controlled", "deprecated")
- `limit` (optional) - Max results (default: 50)
{
"action": "search",
"query": "machine learning",
"scheme_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "controlled"
}
`autocomplete` - Type-ahead concept search
Parameters:
- `action: "autocomplete"`
- `prefix` (required) - Search prefix
- `scheme_id` (optional) - Restrict to specific scheme
- `limit` (optional) - Max results (default: 10)
{
"action": "autocomplete",
"prefix": "mach",
"limit": 5
}
`get` - Get concept details
Parameters:
- `action: "get"`
- `id` (required) - UUID of the concept
{
"action": "get",
"id": "880e8400-e29b-41d4-a716-446655440000"
}
`get_full` - Get concept with all relations
Retrieve concept with broader, narrower, and related concepts.
Parameters:
- `action: "get_full"`
- `id` (required) - UUID of the concept
{
"action": "get_full",
"id": "880e8400-e29b-41d4-a716-446655440000"
}
`stats` - Get governance statistics
Usage metrics for tag health monitoring.
Parameters:
- `action: "stats"`
- `scheme_id` (optional) - Restrict to specific scheme
{
"action": "stats",
"scheme_id": "550e8400-e29b-41d4-a716-446655440000"
}
`top` - Get top-level concepts in scheme
Root concepts without broader relations.
Parameters:
- `action: "top"`
- `scheme_id` (required) - UUID of the concept scheme
{
"action": "top",
"scheme_id": "550e8400-e29b-41d4-a716-446655440000"
}
`list_schemes` - List all concept schemes
Parameters:
- `action: "list_schemes"`
{
"action": "list_schemes"
}
`create_scheme` - Create a new concept scheme
Parameters:
- `action: "create_scheme"`
- `notation` (required) - Short code (e.g., "topics", "domains")
- `title` (required) - Human-readable title
- `description` (optional) - Purpose and scope
- `uri` (optional) - Canonical URI
{
"action": "create_scheme",
"notation": "domains",
"title": "Knowledge Domains",
"description": "Top-level domain taxonomy"
}
`get_scheme` - Get scheme details
Parameters:
- `action: "get_scheme"`
- `scheme_id` (required) - UUID of the concept scheme
{
"action": "get_scheme",
"scheme_id": "550e8400-e29b-41d4-a716-446655440000"
}
`update_scheme` - Update scheme metadata
Parameters:
- `action: "update_scheme"`
- `scheme_id` (required) - UUID of the concept scheme
- `title` (optional) - New title
- `description` (optional) - New description
- `is_active` (optional) - Whether the scheme is active
{
"action": "update_scheme",
"scheme_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Updated Domain Taxonomy",
"description": "Revised domain classification"
}
`delete_scheme` - Delete a concept scheme
Parameters:
- `action: "delete_scheme"`
- `scheme_id` (required) - UUID of the concept scheme
- `force` (optional) - Delete even if scheme has concepts (default: false)
{
"action": "delete_scheme",
"scheme_id": "550e8400-e29b-41d4-a716-446655440000",
"force": true
}
`manage_embeddings`
Manage embedding sets — curated subsets of notes for focused semantic search. Embedding sets allow domain-specific search contexts.
Actions:
| Action | Purpose |
|---|---|
| `list` | List all embedding sets |
| `get` | Get set details by slug |
| `create` | Create a new set with membership criteria |
| `update` | Update set metadata or criteria |
| `delete` | Delete a set |
| `list_members` | List notes in a set |
| `add_members` | Add notes to a set (manual/mixed mode) |
| `remove_member` | Remove a note from a set |
| `refresh` | Recompute auto-criteria membership |
Parameters (varies by action):
- `action` (required) - The action to perform
- `slug` (string) - Embedding set slug (required for get/update/delete/list_members/add_members/remove_member/refresh)
- `name` (string) - Display name (required for create)
- `description` (string) - Set description
- `purpose` (string) - Intended purpose (used by agents to pick the right set)
- `usage_hints` (string) - When to use this set
- `keywords` (array) - Discovery keywords
- `mode` (enum) - `auto`, `manual`, or `mixed` (default: `auto`)
- `criteria` (object) - Auto-membership criteria: `tags`, `collections`, `fts_query`, `include_all`, `exclude_archived`
- `note_ids` (array of uuid) - Notes to add (for `add_members`)
- `note_id` (uuid) - Note to remove (for `remove_member`)
- `limit`/`offset` (integers) - Pagination (for `list_members`)
// List all sets
{ "action": "list" }
// Create a focused set
{
"action": "create",
"name": "ML Research",
"slug": "ml-research",
"mode": "auto",
"criteria": { "tags": ["ml", "research"] }
}
// Search within a set (via search tool)
// search({ action: "text", query: "...", set: "ml-research" })
`manage_archives`
Manage parallel memory archives for schema-level data isolation. Each archive is an independent memory with its own notes, tags, embeddings, and links.
Actions:
| Action | Purpose |
|---|---|
| `list` | List all archives |
| `create` | Create a new archive |
| `get` | Get archive details |
| `update` | Update archive description |
| `delete` | Permanently delete archive and all its data |
| `set_default` | Set as default archive for this session |
| `stats` | Get archive statistics (note count, size, etc.) |
| `clone` | Deep copy an archive to a new name |
Parameters:
- `action` (required) - The action to perform
- `name` (string) - Archive name (required for create/get/update/delete/set_default/stats/clone)
- `description` (string) - Archive description
- `new_name` (string) - Name for cloned archive (required for `clone`)
// List all archives
{ "action": "list" }
// Create a new archive
{ "action": "create", "name": "work-2026", "description": "Work notes for 2026" }
// Get archive stats
{ "action": "stats", "name": "work-2026" }
// Clone an archive
{ "action": "clone", "name": "work-2026", "new_name": "work-2026-backup" }
`manage_encryption`
PKE (Public Key Encryption) operations — keypair generation, encrypt/decrypt plaintext, and local keyset management.
Actions:
| Action | Purpose |
|---|---|
| `generate_keypair` | Generate a new PKE keypair |
| `get_address` | Derive PKE address from a public key |
| `encrypt` | Encrypt plaintext for one or more recipients |
| `decrypt` | Decrypt ciphertext with a private key |
| `list_recipients` | List recipient addresses from ciphertext |
| `verify_address` | Verify a PKE address is valid |
| `list_keysets` | List locally stored keysets |
| `create_keyset` | Create and store a named keyset |
| `get_active_keyset` | Get the currently active local keyset |
| `set_active_keyset` | Set the active local keyset |
| `export_keyset` | Export a keyset to a directory |
| `import_keyset` | Import a keyset from files |
| `delete_keyset` | Delete a locally stored keyset |
Parameters (varies by action):
- `action` (required) - The action to perform
- `passphrase` (string) - Passphrase for private key protection (generate_keypair, create_keyset, decrypt)
- `public_key` (string) - Base64-encoded public key (get_address, encrypt)
- `plaintext` (string) - Base64-encoded plaintext to encrypt
- `recipient_keys` (array) - Recipient public keys for encrypt
- `ciphertext` (string) - Base64-encoded ciphertext (decrypt, list_recipients)
- `encrypted_private_key` (string) - Encrypted private key for decrypt
- `address` (string) - PKE address to verify (format: `mm:...`)
- `name` (string) - Keyset name
- `output_dir` (string) - Output directory for key files
- `import_path` (string) - Keyset directory to import from
// Generate a keypair
{
"action": "generate_keypair",
"passphrase": "<PKE_PASSPHRASE>",
"output_dir": "/home/user/.matric/keys/my-key"
}
// Encrypt for a recipient
{
"action": "encrypt",
"plaintext": "aGVsbG8gd29ybGQ=",
"recipient_keys": ["BASE64_PUBLIC_KEY"]
}
`manage_backups`
Backup, restore, knowledge shard export/import, and memory archive download operations.
Actions:
| Action | Purpose |
|---|---|
| `export_shard` | Generate curl command to download a knowledge shard (.tar.gz) |
| `import_shard` | Generate curl command to upload/import a knowledge shard |
| `snapshot` | Create a database snapshot (named backup) |
| `restore` | Restore database from a snapshot |
| `list` | List all available backups |
| `get_info` | Get details for a specific backup file |
| `get_metadata` | Get metadata for a backup file |
| `update_metadata` | Update backup title/description |
| `download_archive` | Generate curl command to download a knowledge archive |
| `upload_archive` | Generate curl command to upload a knowledge archive |
| `swap` | Swap in a backup as the active memory |
| `download_memory` | Generate curl command to download a memory archive as SQL |
Parameters (varies by action):
- `action` (required) - The action to perform
- `filename` (string) - Backup filename (restore, get_info, get_metadata, update_metadata, download_archive, swap)
- `file_path` (string) - Local path to file (import_shard, upload_archive)
- `output_dir` (string) - Directory for download output
- `include` (string) - Components: comma-separated or `all` (export_shard, import_shard)
- `dry_run` (boolean) - Preview without writing (import_shard, swap)
- `on_conflict` (enum) - `skip`, `replace`, `merge` (import_shard)
- `name` (string) - Snapshot name or memory archive name
- `title` (string) - Human-readable title (snapshot, update_metadata)
- `description` (string) - Description (snapshot, update_metadata)
- `strategy` (enum) - `wipe` or `merge` (swap)
// Export a knowledge shard
{ "action": "export_shard", "output_dir": "/backups" }
// Create a named snapshot
{ "action": "snapshot", "name": "pre-migration", "title": "Before schema migration" }
// List all backups
{ "action": "list" }
Note: Actions that generate a curl command (`export_shard`, `import_shard`, `download_archive`, `upload_archive`, `download_memory`) return a `curl_command` whose `Authorization` header is the placeholder `Authorization: Bearer <ACCESS_TOKEN>` (post-#987 output sanitization). The command is not runnable verbatim — you must replace the placeholder with a real access token before running it.
Shard portability status: REST shard export is reference-only by default
and supports verified attachment sidecars with `include_blobs=true`; import
restores present valid sidecars. The `manage_backups` tool does not yet expose
that opt-in, so its generated `export_shard` command remains reference-only
unless amended. This does not provide `full-v1` disaster-recovery coverage.
`explore_graph`
Traverse the knowledge graph from a starting note up to N hops. Returns a versioned payload with nodes, edges, and metadata including truncation info.
Parameters:
- `id` (required) - UUID of the starting note
- `depth` (optional) - Maximum hops to traverse (default: 2, server max: 10)
- `max_nodes` (optional) - Maximum total nodes to return (default: 50, server max: 1000)
- `min_score` (optional) - Minimum edge score threshold (default: 0.0, range: 0.0-1.0)
- `max_edges_per_node` (optional) - Limit edges per node to prevent hub dominance
- `edge_filter` (optional) - Filter edges by community: `all` (default), `intra_community`, `inter_community`
- `include_structural` (optional) - Include collection edges (default: true)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"depth": 2,
"max_nodes": 50,
"min_score": 0.70,
"edge_filter": "intra_community"
}
`get_note_links`
Get semantic connections for a specific note.
Parameters:
- `id` (required) - UUID of the note
{
"id": "550e8400-e29b-41d4-a716-446655440000"
}
Returns:
- `outgoing` - Notes this note links TO
- `incoming` - BACKLINKS - Notes that link TO this note
Backlinks are crucial for discovering how concepts connect in your knowledge graph.
`get_related_notes`
Find notes related to a given note via semantic similarity and graph links.
Parameters:
- `id` (required) - UUID of the source note
- `limit` (optional) - Maximum results (default: 10, max: 50)
- `min_score` (optional) - Minimum similarity score (default: 0.3)
- `context_summary` (optional) - Include LLM context summary (default: false)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"limit": 5,
"context_summary": true
}
Returns:
- `related` - Array of related notes with `note_id`, `score`, `snippet`, `title`, `tags`, `source`
- `context_summary` - LLM-generated explanation of thematic connection (when requested)
The `source` field indicates how each note was found: `"semantic"` (vector similarity), `"link_outgoing"` (direct link from this note), or `"link_incoming"` (link to this note).
`get_topology_stats`
Get graph topology statistics including degree distribution, connected components, isolated nodes, and current linking strategy. Useful for monitoring graph health after auto-linking.
No parameters required.
{}
`get_graph_diagnostics`
Get embedding quality diagnostics for the knowledge graph. Reports similarity distribution (histogram, mean, std, anisotropy), topology metrics, and normalized edge stats. Useful for detecting the "seashell pattern" where all nodes appear equidistant.
Parameters:
- `sample_size` (optional) - Random embedding pairs to sample (default: 1000, max: 10000)
{ "sample_size": 1000 }
`capture_diagnostics_snapshot`
Capture a labelled diagnostics snapshot for before/after comparison. Run before and after embedding pipeline changes to validate improvements.
Parameters:
- `label` (required) - Descriptive label (e.g., `"before-tfidf-filter"`)
- `sample_size` (optional) - Random pairs to sample (default: 1000)
{ "label": "before-reembed", "sample_size": 1000 }
`list_diagnostics_snapshots`
List saved diagnostics snapshots, ordered by most recent first.
Parameters:
- `limit` (optional) - Max snapshots to return (default: 20)
{ "limit": 10 }
`compare_diagnostics_snapshots`
Compare two diagnostics snapshots to see what changed. Returns computed deltas and a human-readable summary of improvements and regressions.
Parameters:
- `before` (required) - UUID of the "before" snapshot
- `after` (required) - UUID of the "after" snapshot
{
"before": "550e8400-e29b-41d4-a716-446655440000",
"after": "660e8400-e29b-41d4-a716-446655440001"
}
`recompute_snn_scores`
Recompute Shared Nearest Neighbor (SNN) scores for all semantic links. SNN(A,B) = |kNN(A) ∩ kNN(B)| / k. Edges below the threshold are pruned, improving graph quality by keeping only structurally meaningful connections.
Parameters:
- `k` (optional) - Number of nearest neighbors for SNN computation (default: adaptive, log₂(N) clamped to 5-15)
- `threshold` (optional) - SNN score threshold — edges below this are pruned (default: from `GRAPH_SNN_THRESHOLD` env var)
- `dry_run` (optional) - Compute scores but don't apply changes (default: false)
{ "threshold": 0.10, "dry_run": true }
`pfnet_sparsify`
Run PFNET sparsification on the knowledge graph. Removes geometrically redundant edges — an edge (A,B) is pruned if a witness node C provides a shorter indirect path. Typically retains 15-40% of edges on HNSW-derived graphs.
Parameters:
- `q` (optional) - PFNET q parameter (default: 2 = Relative Neighborhood Graph equivalent)
- `dry_run` (optional) - Preview impact without applying (default: false)
{ "q": 2, "dry_run": true }
`export_note`
Export a note as markdown with YAML frontmatter.
Parameters:
- `id` (required) - UUID of the note
{
"id": "550e8400-e29b-41d4-a716-446655440000"
}
Returns markdown file with frontmatter including title, tags, created/updated timestamps, and full content.
`get_documentation`
Access built-in documentation for AI agents.
Parameters:
- `topic` (required) - Documentation topic name
Available topics:
- `overview` - System overview and capabilities
- `search` - Search features and query syntax
- `tags` - SKOS hierarchical tagging
- `embedding-sets` - Focused search contexts
- `templates` - Note templates
- `collections` - Folder organization
- `revision-modes` - AI enhancement modes
- `versioning` - Version history
- `pke` - Public-key encryption
- `backup` - Backup and export
- `jobs` - Background job system
- `health` - Knowledge health metrics
- `multi-memory` - Parallel memory archives
- `document-types` - Content type detection
- `attachments` - File upload and management
- `provenance` - Spatial-temporal tracking
- `mcp-deployment` - MCP server deployment
- `api` - REST API reference
- `architecture` - System design
{
"topic": "search"
}
`get_system_info`
Comprehensive system diagnostics including version, health status, configuration, statistics, and component health.
Returns:
- `version` - Fortémi version
- `status` - Overall health status
- `configuration` - Chunking, AI revision settings, enabled features
- `stats` - Note counts, embedding counts, job queue depth
- `components` - Database, inference, storage health
- `capabilities` - Enabled extraction strategies
{}
`health_check`
Simple health check indicating if the system is operational.
Returns:
- `status` - "healthy" or error state
- `version` - Fortémi version
- `components` - Component health summary
{}
`select_memory`
Set the active memory archive for all subsequent MCP operations in this session.
Parameters:
- `name` (required) - Memory archive name
{
"name": "work-notes"
}
All future operations (create_note, search, list_tags, etc.) will operate on the selected memory until changed or session ends.
`get_active_memory`
Check which memory archive is currently active for this session.
Returns:
- `name` - Active memory name (null if default)
{}
`manage_attachments`
Manage file attachments on notes. Upload, list, get metadata, download, and delete. Image/audio/video attachments are automatically processed by the extraction pipeline.
Parameters:
- `action` (required) - "list", "upload", "get", "download", "delete"
- `note_id` - Note UUID (required for list/upload)
- `id` - Attachment UUID (required for get/download/delete)
- `filename` - Filename hint for upload curl command
- `content_type` - MIME type hint for upload
- `document_type_id` - Explicit document type UUID override
{
"action": "list",
"note_id": "019c5e67-4261-7122-b1ec-88bede99ee92"
}
`get_knowledge_health`
Get overall knowledge base health metrics and diagnostics.
Returns:
- `total_notes` - Total note count
- `orphan_tags` - Tags not used by any notes
- `stale_notes` - Notes not updated recently
- `unlinked_notes` - Notes with no semantic links
- `tag_cooccurrence` - Tag usage patterns
- `recommendations` - Suggested maintenance actions
{}
`manage_jobs`
Monitor and manage background processing jobs — queue status, individual job details, extraction pipeline analytics, and pause/resume control.
Actions:
| Action | Purpose |
|---|---|
| `list` | List jobs with status/type/note filters |
| `get` | Get single job details by ID |
| `create` | Queue a single processing job |
| `stats` | Queue statistics (pending, running, completed, failed) |
| `pending_count` | Quick count of pending jobs |
| `extraction_stats` | Extraction pipeline analytics |
| `pause_status` | Get current global and per-archive pause state |
| `pause` | Pause job processing globally or for a specific archive |
| `resume` | Resume job processing globally or for a specific archive |
Parameters (varies by action):
- `action` (required) - The action to perform
- `id` (uuid) - Job UUID (for `get`)
- `note_id` (uuid) - Note UUID (for `create`, optional filter for `list`)
- `job_type` (string) - Job type: `ai_revision`, `embedding`, `linking`, `context_update`, `title_generation`, `concept_tagging`, `re_embed_all`, `extraction`, `exif_extraction` (for `create`, optional filter for `list`)
- `status` (enum) - pending/running/completed/failed (for `list`)
- `priority` (integer) - Higher = sooner (for `create`)
- `payload` (object) - Job payload (for `create`; required for extraction: `{ strategy, attachment_id, filename, mime_type }`)
- `deduplicate` (boolean) - Skip duplicate pending jobs (for `create`, default: true)
- `model` (string) - Provider-qualified model slug, e.g. `openai:gpt-4o` (for `create`)
- `archive` (string) - Archive name for per-archive pause/resume; omit for global
- `limit`/`offset` (integers) - Pagination (for `list`)
// Check queue health
{ "action": "stats" }
// List failed jobs
{ "action": "list", "status": "failed", "limit": 10 }
// Queue an embedding job
{ "action": "create", "note_id": "550e8400-...", "job_type": "embedding" }
// Quick pending count
{ "action": "pending_count" }
// Pause all job processing
{ "action": "pause" }
// Pause processing for one archive only
{ "action": "pause", "archive": "work-2026" }
// Resume everything
{ "action": "resume" }
`manage_inference`
Discover models and providers, inspect effective source-attributed routing, audit configuration changes, validate endpoints, and hot-swap database overrides. Environment and TOML values remain the fallback when no database override is present; `default_backend` reports the runtime-selected default (including `MATRIC_INFERENCE_DEFAULT`).
Actions:
| Action | Purpose |
|---|---|
| `list_models` | All models from all providers with capabilities and health |
| `get_embedding_config` | Current default embedding model configuration |
| `list_embedding_configs` | All embedding configurations |
| `get_config` | Effective inference config with source attribution |
| `list_providers` | Live provider registry and capabilities |
| `get_config_audit` | Recent redacted config changes |
| `update_config` | Validate and/or persist partial provider and embedding-route overrides |
| `reset_config` | Remove database overrides and fall back to env/TOML/defaults |
| `test_connection` | Probe an Ollama or OpenAI-compatible endpoint |
Update parameters:
- Provider blocks: `ollama`, `openai`, `llamacpp`, `openrouter`
- `embedding_backend`: provider id, JSON `null` to clear, or omit to leave unchanged
- `validate`: probe configured endpoints
- `dry_run`: return the effective result without persistence
- `atomic`: require the complete update to validate and apply together
- `timeout_secs`: 1-120 seconds for `test_connection`
- Audit filters: `limit`, `changed_by`, `audit_action`
// List all available models
{ "action": "list_models" }
// Check current embedding config
{ "action": "get_embedding_config" }
// Inspect effective runtime routing
{ "action": "get_config" }
// Validate an independent local embedding route without persisting it
{
"action": "update_config",
"embedding_backend": "ollama",
"validate": true,
"dry_run": true,
"atomic": true
}
`trigger_graph_maintenance`
Queue the full graph quality pipeline as an asynchronous background job: normalize → SNN scoring → PFNET sparsification → diagnostics snapshot.
Parameters:
- `steps` (optional) - Array of steps to run: `["normalize", "snn", "pfnet", "snapshot"]` (default: all four)
// Run full pipeline
{}
// Run only SNN and PFNET steps
{ "steps": ["snn", "pfnet"] }
Returns the job ID for status tracking via `manage_jobs`.
When to use: After bulk note imports, after changing `GRAPH_*` env vars, or when graph diagnostics show degraded quality (high isolated-node count, seashell patterns).
`coarse_community_detection`
Run MRL 64-dim coarse community detection using Louvain algorithm. Uses truncated Matryoshka embeddings where similarity spread is wider, producing clearer cluster boundaries. Community assignments are written to all notes.
Parameters:
- `coarse_dim` (optional) - MRL truncation dimension (default: 64, range: 2-768)
- `similarity_threshold` (optional) - Minimum cosine similarity for edge inclusion (default: 0.3)
- `resolution` (optional) - Louvain resolution — higher = more, smaller communities
{ "coarse_dim": 64, "similarity_threshold": 0.3 }
Community assignments (`community_id`, `community_label`, `community_confidence`) are written to all notes and appear in graph node responses.
`bulk_reprocess_notes`
Re-run pipeline steps on explicit notes or across the active archive. Archive-wide selection paginates through the note repository, so limits greater than 100 are honored.
Parameters:
- `note_ids` (optional) - Specific note UUIDs; omit to select active notes from the archive
- `steps` (optional) - `ai_revision`, `embedding`, `linking`, `title_generation`, `concept_tagging`, or `all`
- `revision_mode` (optional) - `standard`, `contextual`, `contextual_filtered`, `light`, `none`, or legacy alias `full`
- `limit` (optional) - Maximum selected notes (default: 500, max: 5000)
- `model`, `chunk_max_chars`, `chunk_overlap` (optional) - Pipeline overrides
{
"note_ids": [
"550e8400-e29b-41d4-a716-446655440000",
"660e8400-e29b-41d4-a716-446655440001"
],
"steps": ["embedding", "linking"]
}
Returns aggregate `notes_count` and `jobs_queued`. Inspect individual asynchronous jobs with `manage_jobs`.
Memory-Scoped Operations
All MCP tools operate within the context of the active memory. Use `select_memory` to switch memories:
1. `select_memory({ name: "work-2026" })` - Sets active memory for the session 2. All subsequent tool calls operate on `work-2026` 3. `get_active_memory()` - Check which memory is active 4. Omitting `select_memory` = operations target the default memory
Multi-memory tools (not memory-scoped):
- Memory management actions in `search` tool (`federated` action)
- `select_memory`, `get_active_memory`
These operate on the global memory registry, not the active memory context.
Common Workflows
Capture and Organize Knowledge
// Create a research note — the NLP pipeline handles the rest
const note = await capture_knowledge({
action: "create",
content: "# Transformer Architecture\
\
Key innovation: self-attention...",
tags: ["research"], // Optional user tag for filtering
revision_mode: "light"
})
// The pipeline automatically:
// - Generates a descriptive title
// - Tags with 8-15 SKOS concepts (domain/ai, topic/transformers, etc.)
// - Extracts metadata (authors, year, methodology)
// - Generates tag-enriched embeddings
// - Creates semantic links to related notes
// Move to collection (manual organization)
await manage_collection({
action: "move_note",
note_id: note.id,
collection_id: "research-collection-uuid"
})
// Review auto-generated concept tags (optional)
await manage_tags({
action: "get_concepts",
note_id: note.id
})
// Only use tag_concept/untag_concept if the auto-tags need correction
Search Across Types
// Text search with strict filtering
const textResults = await search({
action: "text",
query: "neural networks",
mode: "hybrid",
strict_filter: {
required_tags: ["research"],
excluded_tags: ["draft"]
}
})
// Spatial search
const spatialResults = await search({
action: "spatial",
latitude: 37.7749,
longitude: -122.4194,
radius_km: 5.0
})
// Federated search across all memories
const federatedResults = await search({
action: "federated",
query: "project documentation",
memories: ["all"]
})
Record Provenance Chain
// Create named location
const location = await record_provenance({
action: "named_location",
name: "San Francisco Office",
latitude: 37.7749,
longitude: -122.4194,
place_type: "office"
})
// Create device
const device = await record_provenance({
action: "device",
device_id: "macbook-2023",
name: "Work Laptop",
device_type: "laptop"
})
// Associate with note
await record_provenance({
action: "note",
note_id: "note-uuid",
location_id: location.id,
device_id: device.id
})
Use Get Documentation for Advanced Features
// Learn about embedding sets
const embeddingDocs = await get_documentation({
topic: "embedding-sets"
})
// Learn about SKOS tagging
const skosDocs = await get_documentation({
topic: "tags"
})
// Learn about multi-memory architecture
const memoryDocs = await get_documentation({
topic: "multi-memory"
})
Full Mode
Set `MCP_TOOL_MODE=full` environment variable to expose all 207 tools instead of the 45 core tools.
When to use:
- Programmatic access requiring precise endpoint control
- Legacy integrations expecting granular tool names
- Debugging or development scenarios
Tradeoffs:
- About 2.4× the serialized schema surface (207 vs 45 tools)
- Increased cognitive complexity for agents
- Slower agent decision-making due to larger tool surface
Example configuration:
{
"mcpServers": {
"fortemi": {
"command": "node",
"args": ["./mcp-server/index.js"],
"env": {
"FORTEMI_URL": "http://localhost:3000",
"MCP_TOOL_MODE": "full"
}
}
}
}
API-Only Features
The following features are available via REST API but not exposed in the core MCP tool surface. Use `MCP_TOOL_MODE=full` for MCP access, or call the REST API directly.
Not in core MCP:
- Note versioning (version history, diffs, restore)
- SKOS concept CRUD and relation management (create/update/delete concepts, broader/narrower/related relations)
- SKOS collections (concept grouping, `list_skos_collections`, `add_skos_collection_member`, etc.)
- OAuth client management and token endpoints
- Embedding configs (model-level configuration: create, update, delete configs)
- Document types (create, update, delete, detection)
- Cache management (invalidation, statistics)
- Note purge operations (`purge_note`, `purge_notes`, `purge_all_notes` — hard delete)
- Timeline and activity views (`get_notes_timeline`, `get_notes_activity`)
- API key management (`list_api_keys`, `create_api_key`)
Available in core MCP (contrary to what some documentation may suggest):
- Embedding sets — via `manage_embeddings` (list, create, update, delete, members, refresh)
- PKE encryption — via `manage_encryption` (keypair generation, encrypt/decrypt, keysets)
- Background jobs — via `manage_jobs` (list, create, stats, pause/resume)
- Backup/restore — via `manage_backups` (knowledge shards, snapshots, archives)
- Memory archives — via `manage_archives` (list, create, stats, clone)
- File attachments — via `manage_attachments` (list, upload, get, download, delete)
Full API reference: See API Documentation and OpenAPI Spec
Related Documentation
- API Reference - REST API documentation
- Multi-Memory Guide - Parallel memory archives and federated search
- Multi-Memory Agent Guide - Segmentation strategies for agents
- SKOS Tags - Hierarchical tagging system
- Architecture - System design
- Backup Guide - Backup strategies
- Real-Time Events - SSE, WebSocket, and webhook event streaming
- Document Types Guide - Content type detection and chunking
- Embedding Model Selection - Model selection guidance
- MCP Deployment Guide - Deployment and security considerations