Documentation
Connect your AI agents to Second Brain in under 2 minutes.
Quickstart
Create an account
Sign up at stovaro.com/signup
Create an API key
Go to API Keys and create a key. Copy it immediately — it's shown only once.
Connect your AI agent
Pick your tool below and follow the instructions.
Claude.ai / Claude Desktop Connector
Connect Second Brain directly to Claude.ai or the Claude Desktop app — no API key needed. Claude authenticates via OAuth.
Open Connector Settings
In Claude, go to Settings → Connectors and click "Add custom connector" at the bottom.
Enter connection details
| Server URL | https://stovaro.com/mcp/sse |
| Client ID | 1d56be40-0b33-4bce-868f-d1ae99dce691 |
| Client Secret | Provided after signup — check your account page |
Authorize
You'll be redirected to stovaro.com to log in and approve access. Click Authorize.
Start using it
Second Brain's tools now appear in Claude. Try: "Save a note about our meeting today" or "Search my notes for project architecture".
You can manage connected apps and revoke access from your Account page.
SKILL.md — Make Claude Use Second Brain Automatically
By default, Claude won't write to Second Brain unless you ask it to. To make it proactive — automatically saving important information and checking for context — add the SKILL.md to your project or conversation.
For Claude Code projects
Add this line to your project's CLAUDE.md:
Follow the instructions at https://stovaro.com/SKILL.md for using Second Brain.
Claude Code will fetch and follow the skill automatically. It will save decisions, preferences, and important context to your Second Brain as you work.
For Claude.ai / Desktop conversations
Paste this at the start of a conversation (or add it to your custom instructions):
You have access to Second Brain via the connected MCP tools. Follow the instructions at https://stovaro.com/SKILL.md — save important information proactively and search before answering questions that might have prior context.
What the skill tells Claude to do
- Save automatically — decisions, preferences, research findings, and anything the user would want recalled later
- Search first — check for existing context before starting work or making recommendations
- Update, don't duplicate — append to existing notes instead of creating duplicates
- Link related notes — build a connected knowledge graph over time
View the full skill: stovaro.com/SKILL.md
Claude Code (CLI)
Run this in your terminal:
claude mcp add --transport http second-brain https://stovaro.com/mcp \ --header "Authorization: Bearer YOUR_API_KEY"
To make it available globally (not just the current project):
claude mcp add --transport http --scope user second-brain https://stovaro.com/mcp \ --header "Authorization: Bearer YOUR_API_KEY"
Restart Claude Code after adding. Then try: "save a note called test to my second brain"
Claude Desktop
Edit your config file:
- Mac:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add this to the file (create it if it doesn't exist):
{
"mcpServers": {
"second-brain": {
"url": "https://stovaro.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Restart Claude Desktop. You'll see "second-brain" in the MCP tools list.
Cursor / Windsurf
Create .cursor/mcp.json (Cursor) or .windsurf/mcp.json (Windsurf) in your project root:
{
"mcpServers": {
"second-brain": {
"url": "https://stovaro.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
cURL
Test your connection from the terminal:
# Save your API key
export SB_KEY="YOUR_API_KEY"
# Create a note
curl -X POST https://stovaro.com/api/v1/notes \
-H "Authorization: Bearer $SB_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "My First Note", "content": "Hello from the API!", "tags": ["test"]}'
# List all notes
curl https://stovaro.com/api/v1/notes \
-H "Authorization: Bearer $SB_KEY"
# Search notes
curl "https://stovaro.com/api/v1/search?q=hello" \
-H "Authorization: Bearer $SB_KEY"
# Get all tags
curl https://stovaro.com/api/v1/tags \
-H "Authorization: Bearer $SB_KEY"
# Delete a note (replace 1 with note ID)
curl -X DELETE https://stovaro.com/api/v1/notes/1 \
-H "Authorization: Bearer $SB_KEY"
Python
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://stovaro.com/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
# Create a note
requests.post(f"{BASE}/notes", headers=headers, json={
"title": "From Python",
"content": "Created programmatically",
"tags": ["python", "automation"]
})
# List notes
notes = requests.get(f"{BASE}/notes", headers=headers).json()
# Search
results = requests.get(f"{BASE}/search", headers=headers, params={"q": "python"}).json()
# Create a link between notes
requests.post(f"{BASE}/links", headers=headers, json={
"source_note_id": 1,
"target_note_id": 2,
"relation_type": "related_to"
})
JavaScript / Node.js
const API_KEY = "YOUR_API_KEY";
const BASE = "https://stovaro.com/api/v1";
const headers = {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
};
// Create a note
await fetch(`${BASE}/notes`, {
method: "POST", headers,
body: JSON.stringify({
title: "From JavaScript",
content: "Hello from Node!",
tags: ["js"]
})
});
// List notes
const notes = await fetch(`${BASE}/notes`, { headers }).then(r => r.json());
// Search
const results = await fetch(`${BASE}/search?q=hello`, { headers }).then(r => r.json());
// Get graph neighbors
const graph = await fetch(`${BASE}/graph/neighbors/1?depth=2`, { headers }).then(r => r.json());
API Reference
Authentication
Every request requires a Bearer token in the Authorization header:
Authorization: Bearer YOUR_API_KEY
Requests without a valid token return 401 Unauthorized.
Scopes
API keys have scoped permissions. The default key gets all scopes:
| Scope | Allows |
|---|---|
notes:read | List, get, and view notes |
notes:write | Create, update, delete notes and links |
search:read | Search notes (fulltext and semantic) |
graph:read | Traverse the knowledge graph |
Rate Limits
| Plan | Per minute | Per month | API keys |
|---|---|---|---|
| Hacker (free) | 60 | 1,000 | 1 |
| Builder ($19/mo) | 60 | 50,000 | 5 |
| Scale ($49/mo) | 60 | 500,000 | 20 |
Exceeding limits returns 429 Too Many Requests.
Endpoints
Notes
| Method | Path | Description |
|---|---|---|
GET | /api/v1/notes | List notes. Query: ?tag= ?limit= (max 200) |
POST | /api/v1/notes | Create note. Body: title (required), content, tags[], embedding[] |
GET | /api/v1/notes/:id | Get note with incoming and outgoing links |
PUT | /api/v1/notes/:id | Update note. Send version for optimistic locking (409 on conflict) |
DELETE | /api/v1/notes/:id | Delete note |
Search
| Method | Path | Description |
|---|---|---|
GET | /api/v1/search | Query: ?q= (fulltext), ?embedding=[] (semantic), or both (hybrid). ?limit= (max 100) |
Links & Graph
| Method | Path | Description |
|---|---|---|
POST | /api/v1/links | Create link. Body: source_note_id, target_note_id, relation_type |
DELETE | /api/v1/links/:id | Delete link |
GET | /api/v1/tags | List all tags with counts |
GET | /api/v1/graph/neighbors/:id | Graph traversal. Query: ?depth= (1-3, default 1) |
Response Codes
| Code | Meaning |
|---|---|
200 | Success |
201 | Created |
204 | Deleted (no body) |
400 | Bad request (missing required params) |
401 | Unauthorized (missing or invalid API key) |
403 | Forbidden (API key lacks required scope) |
404 | Not found (or belongs to another user) |
409 | Version conflict (optimistic locking) |
422 | Validation error (duplicate title, etc.) |
429 | Rate limit exceeded |
MCP Tools Reference
When connected via MCP, your AI agent gets 9 tools:
title (required), content, tags[], embedding[]id (required), title, content, mode (replace|append|prepend), tags[], embedding[]id (required)id or title (one required)tag, limit (default 20, max 100)query (text search), embedding[] (vector search), limitsource_id, target_id (required), relation_type (references | related_to | derived_from)id (required), direction (incoming | outgoing | both)Example Use Cases
Persistent memory for Claude Code
Add this to your project's CLAUDE.md:
When you learn something important about this project — architecture decisions, user preferences, bug fixes, or conventions — save it to Second Brain using create_note. Before starting work, use search_notes to check for relevant context.
Every Claude Code session now builds on the last one.
Research assistant that remembers
# Agent researches a topic and saves findings create_note( title: "React Server Components", content: "RSCs execute on the server, reducing client bundle size...", tags: ["react", "architecture", "research"] ) # Weeks later, a different agent searches for context search_notes(query: "server-side rendering react") # → Returns the RSC note plus any related findings # Agent connects related discoveries link_notes(source_id: 1, target_id: 2, relation_type: "related_to")
Multi-agent shared brain
Give the same API key to Claude Code, Cursor, and custom scripts. They all read and write to the same knowledge base:
# Claude Code saves an architecture decision at 2pm create_note(title: "Auth: JWT not sessions", content: "We chose JWT because...") # Cursor reads it at 3pm when implementing auth search_notes(query: "authentication approach") # → Finds the decision, implements accordingly # A nightly cron agent summarizes the day's knowledge list_notes(tag: "decision") # → All decisions in one place
Personal knowledge graph
# Build a web of connected knowledge create_note(title: "Elixir", content: "Functional language on the BEAM VM...", tags: ["language"]) create_note(title: "Phoenix", content: "Web framework for Elixir...", tags: ["framework"]) create_note(title: "LiveView", content: "Server-rendered reactive UIs...", tags: ["framework"]) # Connect them link_notes(source_id: 2, target_id: 1, relation_type: "derived_from") # Phoenix → Elixir link_notes(source_id: 3, target_id: 2, relation_type: "derived_from") # LiveView → Phoenix # Traverse the graph get_links(id: 1, direction: "incoming") # → Phoenix and LiveView both link back to Elixir