Back to Docs

MCP Server

Give your AI agents access to your personal knowledge base.

https://mcp.solem.ai/mcpStreamable HTTPBearer Auth

Getting Your API Key

Before an agent can access your knowledge base, you need to create an API key.

  1. Sign in at app.solem.ai/settings
  2. Under API Keys, click Create API Key
  3. Give it a name (e.g. “Claude Desktop”, “Cursor”, “OpenClaw”)
  4. 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 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.

ParameterTypeRequiredDescription
querystringSearch keywords
limitnumberDefault: 10Max 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.

ParameterTypeRequiredDescription
limitnumberDefault: 10Number 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.

ParameterTypeRequiredDescription
idstring (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.

ParameterTypeRequiredDescription
urlstring (URL)URL to save
notesstringOptional 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.

ParameterTypeRequiredDescription
idstring (UUID)Page UUID
setobjectFields to overwrite (see below)
append_notesstringText to append to notes (blank line separator)
expected_versionnumberOptimistic lock: update only if version matches

At least one of set or append_notes is required.

Editable fields in set:

FieldTypeMax Length
titlestring | null500
descriptionstring | null5,000
notesstring | null50,000
contentstring | null250,000
check_laterboolean
published_atstring | nullISO 8601
canonical_urlstring | nullhttp/https URL
site_namestring | null
authorstring | null
typestring | 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.

ParameterTypeRequiredDescription
idstring (UUID)Page UUID

Workflows & Best Practices

Answering questions about saved content

  1. search with relevant keywords → get matching page IDs
  2. get the most relevant pages → read full content
  3. Synthesize an answer citing the source pages (title + URL)

Saving a page

  1. User shares a URL
  2. Confirm: "Want me to save this to your Solem library?"
  3. save with optional notes

Adding research notes

  1. search or list_recent to find the page
  2. get to read current notes
  3. 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

ScopeLimit
Per API key100 requests / minute
Global (all keys)1,000 requests / minute

Error Handling

ErrorWhat to do
Page not found or not accessibleCheck UUID from search/list results
No pages found matching "..."Try different keywords
Conflict: expected_version mismatchRe-read page, get new version, retry
At least one mutation is requiredInclude set or append_notes in update
Unknown fields in setOnly use documented editable fields
429 Too Many RequestsWait a few seconds and retry
401 UnauthorizedCheck API key is correct and not revoked

Server: solem v1.0.0 · Transport: Streamable HTTP · Health: GET https://mcp.solem.ai/health