MCP App Store
Productivity
Hjarni icon

Hjarni

by Evert Van den Bruel

Overview

Hjarni is a note-taking app your AI can actually use. Write notes in Markdown. Organize them in folders and tags. ChatGPT reads them directly through MCP, no plugins, no copy-pasting context into every conversation.

Set instructions per folder to control how ChatGPT writes, formats, and tags your notes. Share a folder with your team. Search across everything instantly.

Your AI starts every conversation from zero. Give it a memory.

Tools

containers-create

ChatGPT
Create a new container (folder) for organizing notes. Required: name (string). Optional: description (string), parent_id (integer) for nesting inside another container. After creating, consider setting up LLM instructions with instructions-update.

containers-get

ChatGPT
Get a single container by ID, including notes_count, children_count, and LLM instructions if set. Optional: include_tree (boolean) to also get ancestor chain and children. Required: id (integer).

containers-list

ChatGPT
List containers (folders) for organizing notes. Each container includes notes_count and children_count. Optional: team_id (integer) for team containers, scope ('roots' default|'all'|'archived'), page, per_page. Shared containers are automatically included when listing root-level personal containers.

containers-permissions

ChatGPT
Set or clear a team member's role on a team container. Roles cascade to descendants unless a child has its own role. Caller must have admin role on the target container. Required: container_id (integer, must be a team container), user_id (integer, must be a member of the same team), role ('viewer' | 'editor' | 'admin' | 'inherit'). Use 'inherit' to delete an explicit role and fall back to the role inherited from an ancestor (or from team membership). Team owners are always admin and cannot be downgraded. Returns the user's resulting effective_role on that container.

containers-update

ChatGPT
Update an existing container — rename, change description, move to a different parent, or set display position. Required: id (integer). Optional: name, description, parent_id (null for root), position (integer, lower = first).

dashboard-get

ChatGPT
Get an overview of the Second Brain: counts of notes, containers, tags, inbox items, and the 5 most recently updated notes. No parameters required.

feedback-submit

ChatGPT
Submit feedback about Hjarni itself — confusing tool descriptions, missing capabilities, unexpected errors, friction, or praise. Use this when something about the MCP server, a tool, or the product behavior is worth flagging to the maintainers. Do NOT use this for the user's own notes or knowledge — those belong in notes-create. Required: category ('bug'|'confusing'|'missing_feature'|'friction'|'praise'|'other'), message (string, what's wrong and ideally what you'd expect instead). Optional: severity ('low'|'medium'|'high', default 'medium'), tool_name (the MCP tool the feedback is about, e.g. 'notes-update'), context (JSON-encoded string with any extra structured data — error excerpts, the arguments you tried, the workflow that broke).

files-attach

ChatGPT
Attach a file to a note via base64-encoded data. Prefer files-create_upload_url for large files to save tokens. Required: note_id (integer), filename (string), data (base64 string). Optional: content_type (MIME type, default: application/octet-stream), description.

files-attach_from_url

ChatGPT
Fetch a file from a public URL and attach it to a note. Follows one redirect. Required: note_id (integer), url (string). Optional: filename (default: derived from URL), content_type (default: from HTTP response), description.

files-check_upload

ChatGPT
Check the status of a file upload created by files-create_upload_url. Returns status: 'pending' (not uploaded yet), 'completed' (file attached, includes file metadata), or 'expired' (link timed out). Required: token (string, from files-create_upload_url response).

files-create_upload_url

ChatGPT
Generate a one-time upload URL for attaching a file to a note. Share this URL with the user so they can upload directly in their browser — saves tokens by avoiding base64 encoding. The link expires after 30 minutes. Use files-check_upload to verify completion. Required: note_id (integer). Optional: description.

files-get_download_url

ChatGPT
Get a temporary download URL for a file attached to a note. Share the URL with the user to download in their browser. URL expires after a few minutes. Required: note_id (integer), file_id (integer, from notes-get response).

files-remove

ChatGPT
Permanently remove a file attachment from a note. This action is irreversible. Required: note_id (integer), file_id (integer, from notes-get response).

instructions-get

ChatGPT
Get LLM instructions at the specified level. Call with level 'brain' early in conversations to learn user preferences. Required: level ('brain'|'personal_root'|'container'|'team'). Optional: id (integer, required for 'container' and 'team' levels). 'container' level returns the full inheritance chain (personal root -> ancestors -> container).

instructions-update

ChatGPT
Update LLM instructions at the specified level. Required: level ('brain'|'personal_root'|'container'|'team'), instructions (string). Optional: id (integer, required for 'container' and 'team'), mode ('replace' default|'append'). In 'replace' mode (default), the provided text overwrites existing instructions. In 'append' mode, the text is appended to existing instructions with a newline separator. Always read current instructions first before replacing to avoid losing existing content.

me

ChatGPT
Get the connected user's profile, plan, onboarding state, team memberships, and note quota in a single call. Call this once at the start of a conversation so you can greet the user by first name, run the onboarding script only when needed, route notes to the right team space, and avoid suggesting Pro features to free users. Returns onboarding.completed (boolean) and onboarding.missing_steps (array of 'connect_mcp' | 'first_note' | 'instructions'), which together tell you what, if any, setup is left. Exposes the user's email address and plan — same data the user sees in account settings, but never billing or token metadata. No parameters required.

notes-create

ChatGPT
Create a new note. Required: title (string). Optional: body (Markdown with [[id:Note Title]] wiki-links), summary, source_url, container_id, tag_list (comma-separated), team_id (to create in a team). Example: {title: 'Meeting Notes', body: '## Agenda\n...', container_id: 5, tag_list: 'meetings, q4'}.

notes-delete

ChatGPT
Permanently delete a note. This action is irreversible — the note and all its file attachments are destroyed. Required: id (integer).

notes-get

ChatGPT
Get a single note by ID, including its full Markdown body, tags, container path, linked notes (outgoing), backlinks (incoming links from other notes), file attachments, and inherited LLM instructions. Required: id (integer).

notes-list

ChatGPT
List notes with optional filtering, sorting, and pagination. Returns paginated results. Optional: team_id (integer) to list team notes, scope ('active'|'archived'|'inbox'|'favorited'), container_id (integer) with include_nested (boolean), tags (array of strings, AND logic), tag_ids (array of integers, AND logic), summary_stale (boolean, filter to notes with outdated summaries), sort ('recent'|'oldest'|'title'), page (integer, default 1), per_page (integer, max 100, default 25). Example: list ruby-tagged notes in a container: {container_id: 5, tags: ['ruby']}.

notes-update

ChatGPT
Update a note. Required: id (integer). Optional content: title, body (full replace), append_body (appends to existing body — mutually exclusive with body), summary, source_url. Optional organization: container_id (move note), archived (boolean, personal only), favorited (boolean). Optional tags: tag_list (full replace, comma-separated), add_tags (comma-separated tags to add), remove_tags (comma-separated tags to remove). tag_list takes precedence over add_tags/remove_tags if both provided. Example — append and add a tag: {id: 42, append_body: '\n## Update\nNew info here', add_tags: 'updated'}.

tags-create

ChatGPT
Create a new tag. Check tags-list first to avoid duplicates. Required: name (string). Tag names are automatically lowercased.

tags-list

ChatGPT
List all tags with their notes_count. Paginated. Optional: page (integer), per_page (integer).

teams-get

ChatGPT
Get team details including the 10 most recent notes. Required: id (integer).

teams-list

ChatGPT
List all teams the user is a member of, including members_count, notes_count, and containers_count for each team. No parameters required.

App Stats

27

Tools

3

Prompts

Apr 29, 2026

First seen

ChatGPT

Platforms

Category

Memory Notes

Works with

ChatGPT

Data refreshed daily