MCP Server
Give your AI agents access to your personal knowledge base.
Getting Your API Key
Before an agent can access your knowledge base, you need to create an API key.
- Sign in at app.solem.ai/settings
- Under API Keys, click Create API Key
- Give it a name (e.g. “Claude Desktop”, “Cursor”, “OpenClaw”)
- Copy the key immediately — it’s only shown once
Keys look like sk_solem_a1b2c3d4e5... · Max 5 active keys · Revoke unused keys from Settings
Connecting Your Agent
Claude Desktop / Cursor
{
"mcpServers": {
"solem": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://mcp.solem.ai/mcp",
"--header",
"Authorization: Bearer YOUR_API_KEY"
]
}
}
}Claude Code
claude mcp add solem -- npx -y mcp-remote https://mcp.solem.ai/mcp --header "Authorization: Bearer YOUR_API_KEY"OpenClaw
{
"mcpServers": {
"solem": {
"url": "https://mcp.solem.ai/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}Any MCP-compatible agent
POST to https://mcp.solem.ai/mcp with header Authorization: Bearer sk_solem_... · Streamable HTTP · Stateless
Tools Reference
search
Search saved pages by keyword. Full-text search across titles, descriptions, notes, and content.
When to use: The user asks about something they’ve read, saved, or bookmarked.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | ✅ | Search keywords |
| limit | number | Default: 10 | Max results (1–50) |
// Returns
[{
"id": "uuid",
"title": "Page Title",
"url": "https://example.com/article",
"snippet": "...matching text excerpt...",
"notes_preview": "User's notes...",
"created_at": "2026-03-05T10:30:00Z",
"site_name": "Example Blog"
}]list_recent
List most recently saved pages, newest first.
When to use: “What did I save recently?”, browsing without a specific query.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | number | Default: 10 | Number of pages (1–50) |
get
Retrieve the full content of a saved page by UUID.
When to use: After finding a page via search/list_recent, read its full text to answer questions.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string (UUID) | ✅ | Page UUID from search/list results |
// Returns
{
"id": "uuid",
"title": "Page Title",
"url": "https://example.com/article",
"content": "Full extracted text...",
"description": "Meta description",
"notes": "User's personal notes",
"created_at": "2026-03-05T10:30:00Z",
"published_at": "2026-03-01T08:00:00Z",
"site_name": "Example Blog",
"author": "Jane Doe",
"type": "article",
"canonical_url": "https://example.com/article",
"check_later": false
}save
Save a new URL. Fetches the page, extracts metadata and content, stores everything.
When to use: User shares a URL to bookmark. Always confirm before saving.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string (URL) | ✅ | URL to save |
| notes | string | — | Optional notes to attach |
update
Update fields on an existing saved page. Supports partial updates, note appending, and optimistic concurrency.
When to use: Edit notes, fix titles, add annotations, enrich a page with analysis.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string (UUID) | ✅ | Page UUID |
| set | object | — | Fields to overwrite (see below) |
| append_notes | string | — | Text to append to notes (blank line separator) |
| expected_version | number | — | Optimistic lock: update only if version matches |
At least one of set or append_notes is required.
Editable fields in set:
| Field | Type | Max Length |
|---|---|---|
| title | string | null | 500 |
| description | string | null | 5,000 |
| notes | string | null | 50,000 |
| content | string | null | 250,000 |
| check_later | boolean | — |
| published_at | string | null | ISO 8601 |
| canonical_url | string | null | http/https URL |
| site_name | string | null | — |
| author | string | null | — |
| type | string | null | — |
append_notes: If notes exist, appends with a blank-line separator. If no notes, sets directly.
expected_version: Pass the page’s current version to prevent overwriting concurrent edits. Mismatch → conflict error.
delete
Permanently delete a saved page. Always confirm with the user first.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string (UUID) | ✅ | Page UUID |
Workflows & Best Practices
Answering questions about saved content
- search with relevant keywords → get matching page IDs
- get the most relevant pages → read full content
- Synthesize an answer citing the source pages (title + URL)
Saving a page
- User shares a URL
- Confirm: "Want me to save this to your Solem library?"
- save with optional notes
Adding research notes
- search or list_recent to find the page
- get to read current notes
- update with append_notes — never overwrite without asking
Agent guidelines
- 📖 Read before write — always search/get before update/delete
- ✅ Confirm before mutating — ask before save, destructive updates, or delete
- 📎 Cite sources — mention page title and URL when answering
- 🎯 Be efficient — use search with good keywords rather than listing everything
- 🔒 Respect privacy — the knowledge base is personal
Rate Limits
| Scope | Limit |
|---|---|
| Per API key | 100 requests / minute |
| Global (all keys) | 1,000 requests / minute |
Error Handling
| Error | What to do |
|---|---|
| Page not found or not accessible | Check UUID from search/list results |
| No pages found matching "..." | Try different keywords |
| Conflict: expected_version mismatch | Re-read page, get new version, retry |
| At least one mutation is required | Include set or append_notes in update |
| Unknown fields in set | Only use documented editable fields |
| 429 Too Many Requests | Wait a few seconds and retry |
| 401 Unauthorized | Check API key is correct and not revoked |
Server: solem v1.0.0 · Transport: Streamable HTTP · Health: GET https://mcp.solem.ai/health