Skip to content

Docs

Use Hjarni with Meta Muse

Muse cannot add an MCP server, so the one-click route every other assistant uses is closed. What works instead is a custom connector on the Hjarni REST API. This page is the spec Muse reads to build one.

Where Muse stands on MCP

Checked 17 September 2026

Muse does not accept MCP servers. Its extensibility is Meta's own Connectors list (Gmail, Google Calendar, Outlook, Facebook, Instagram, Threads, Apple Health and a handful more), plus a builder that makes a custom connector from an API and credentials you supply. There is no field anywhere in Muse that takes an MCP server URL.

That surprises people, because Muse Spark, the model underneath, is explicitly trained for it: Meta's launch post says it “zero-shot generalizes to new native tools, MCP servers, and custom skills.” The model can speak MCP. The consumer app gives it nothing to speak to, and the Meta Model API documents a web_search tool and ordinary function calling with no MCP tool type, so even a developer wiring Muse Spark up runs the MCP client themselves.

So the honest summary is two different answers to one question, and the one that matters depends on which Muse you mean:

The Muse app

No MCP. Use the REST API.

A custom connector against https://hjarni.com/api/v1, authenticated with a personal API token. That is the rest of this page.

Muse Spark on the Meta Model API

MCP works, but you host the client.

Point your own agent loop at https://hjarni.com/mcp, translate the tools into function definitions, and pass them on each call. The MCP server reference documents every tool.

If Muse ever grows a field that takes a server URL, Hjarni works in it that day with nothing to build: https://hjarni.com/mcp is the same endpoint Claude and ChatGPT already use. This page exists because that field does not exist yet.

Connect Muse to Hjarni

1. Create an API token in Hjarni

  1. Log in to Hjarni and open Settings > Connections.
  2. Click Create token and name it muse, so you can revoke this one connector without touching the others.
  3. Copy the token. It is shown once.

2. Ask Muse to build the connector

Paste this into Muse, with your token in place of the placeholder. It points Muse at the Markdown twin of this page, which carries the whole contract in a form a model reads cleanly:

“Create a custom connector for Hjarni, my notes knowledge base. Read https://hjarni.com/docs/muse.md for the base URL, the auth header and the endpoints. My token is YOUR_API_TOKEN. Once it works, tell me how many notes I have and what my folders are called.”

Muse stores the credential itself; Hjarni never sees your Muse account. If Muse asks where the connector lives in its settings, it is under Settings > Connectors, the same list as Gmail and Calendar.

3. Verify it actually connected

Ask Muse: “How many notes are in my Hjarni account, and what are my folders called?”

A working connector answers with your real numbers, from GET /me and GET /containers. A connector that silently failed answers in generalities, or tells you what Hjarni is. That difference is the whole test: an agent describing your notes plausibly is the failure mode to watch for, not an error message.

Not yet verified on a live Muse account. Muse is US-only for adults at launch, so we have documented the contract rather than a walkthrough we have run end to end. The API side is exercised by our own test suite; the Muse side is Meta's connector builder doing what its help page says it does. If it fails for you, email evert@hjarni.com with what Muse said and we will fix the spec.

The API contract Muse needs

Everything below is what a custom connector has to know. The Markdown twin of this page is the same content without the markup, which is the URL to hand any agent. The full REST API reference documents every endpoint, including the ones Muse will not need.

Base URL
https://hjarni.com/api/v1
Auth
Authorization: Bearer YOUR_API_TOKEN
Content type
application/json
Pagination
page and per_page query params, 25 per page by default and 100 at most. The total comes back as an X-Total-Count header, with X-Page and X-Per-Page beside it.
Rate limit
100 requests per minute, per account rather than per token, so this connector shares one budget with every other token on the account. Over it returns 429 with Retry-After.
Response shape
No envelope on the way out: collections are bare JSON arrays, a single note or folder a bare object. Writes take the {"note": {...}} wrapper, reads do not return one.
Note format
Markdown body, plus a short summary the agent should always write.

The six calls that cover ordinary use

GET /me

Who the token belongs to, the plan, and quota usage under limits (notes_used against notes_limit, not a raw note total). Call this first: it is the connection test. A folder-scoped token gets the user block alone, with no limits and no onboarding, so build the connector on an account-wide token unless you mean to narrow it.

GET /search?q=...

Full-text search. Add search_scope=personal to skip team notes, or exclude_body=true to leave note bodies out of the results (titles, summaries, tags and the rest still come back). Omitting search_scope searches personal and team notes together, and team:<id> narrows to one team. Archived and trashed notes are never included, and a blank q drops the text filter rather than erroring.

GET /notes/:id

One note in full. Wiki-links arrive as linked_note_ids rather than nested notes, and attachments as metadata plus a download URL that expires 15 minutes after it is minted (url_expires_at says when). Re-read the note for a fresh one instead of caching the link.

POST /notes

Create a note. Wrap the fields in a {"note": {...}} envelope; anything sent flat is rejected. title is the only required one (max 500 characters, and a body caps at 256 KiB); send body, summary, tag_list and container_id too. Answers 201 with the created note.

PATCH /notes/:id

Update a note in place, same envelope. Prefer this over creating a near-duplicate, because an updated note keeps its history. Send back the lock_version you read as expected_lock_version and a write that raced someone else answers 409 with the current version, rather than quietly overwriting them.

GET /containers

Your top-level folders, so a new note lands somewhere sensible instead of at the root. Roots only, and paginated: add ?scope=all for every active folder (archived ones stay out), or GET /containers/:id/tree for one folder with its ancestors and its direct children. Neither returns a whole nested tree in one call, so finding a deep folder by name means walking it.

Worked examples

Run these in a terminal first, so a later failure has one fewer cause. A working curl rules out the token and the endpoint; it does not by itself prove the remaining fault is Muse's, since a connector can also be sending a shape the API refuses.

Confirm the token

curl https://hjarni.com/api/v1/me \
  -H "Authorization: Bearer YOUR_API_TOKEN"

Search, titles and summaries only

curl "https://hjarni.com/api/v1/search?q=quarterly+planning&search_scope=personal&exclude_body=true" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

Create a note

curl -X POST https://hjarni.com/api/v1/notes \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "note": {
      "title": "Kitchen renovation quotes",
      "body": "- Vanhoof: EUR 14,200\n- De Smet: EUR 12,800",
      "summary": "Two quotes for the kitchen, with prices and lead times.",
      "tag_list": "house, renovation",
      "container_id": 12
    }
  }'

That container_id is an example. Take a real one from GET /containers: an id that is not yours answers 404, and leaving it out files the note at the root. A request carrying no note object at all answers 400.

Two shapes, and a connector that reads only one reports the other as a blank failure: a single error string, or an errors array when a note fails validation. Most errors are JSON, but not all of them are guaranteed to be, so send Accept: application/json and treat a non-JSON error body as possible rather than impossible.

401

A missing, malformed or revoked token.

403

Two causes with different payloads. A plan gate (the Free note limit, an attachment past the free allowance) carries an upgrade_url beside the error; a permission or token-scope refusal carries the error alone, so treat upgrade_url as optional. Worth handling explicitly, since the note limit is the one a person actually meets, and an agent that reports it as a generic failure hides the one thing that would fix it.

404

A note or folder that is gone, was never on this account, or sits outside the token's scope. This one is raised rather than rendered, so its body is whatever the request negotiated and need not carry an error key at all.

422

Validation failed. Usually an errors array naming what was wrong, so it can be corrected and retried rather than reported as-is; a rejected file attachment answers with a single error instead.

429

Rate limited. Wait for Retry-After rather than retrying at once.

What to ask Muse once it is connected

On an ordinary account-wide token, Muse reads and writes the same personal notes Claude and ChatGPT see. One asymmetry to know: search spans your team notes while fetching and writing a note stays personal, so a team hit in search results is not necessarily one this token can open. The useful prompts are the ones that lean on Muse's own connectors at the same time, since that is what it has and your other assistants do not:

  • Across Gmail and your notes. “Find the contractor emails from last month and add anything new to my kitchen renovation note in Hjarni.”
  • Before a meeting. “My calendar says I am seeing Anna at 3. Search Hjarni for what we agreed last time.”
  • Capture on the phone. “Save this as a Hjarni note in my Ideas folder, with a summary.”
  • Keep one note true. “Update my ‘working preferences’ note rather than making a new one.”

Tell Muse once to always write a two or three sentence summary on a new note. Summaries are indexed for search and are what a result list carries in place of a full body, so a connector that skips them leaves every other assistant less to go on when it picks which note to open.

What this route costs you

A custom connector is a worse connection than MCP, not an equal one. Worth knowing which parts you are giving up, because most of them are invisible until something goes wrong:

No tool descriptions

An MCP client is told what each tool does and when to use it, by the server, on every session. Muse knows only what you told it when the connector was built, so it drifts as your usage changes and you correct it by hand.

Your AI instructions are reachable, but nothing hands them over

Hjarni's per-folder and account-level AI instructions are in the API: every folder payload carries llm_instructions, and GET /containers/root_instructions returns the account-level ones. What REST does not do is deliver them. An MCP client is handed your conventions as part of connecting; a connector has to know to go and read them, and Muse will not unless you say so. Worth putting in the connector's own instructions, or your conventions hold in Claude and ChatGPT and not here.

A long-lived credential, not a session

MCP clients hold an OAuth grant you can see and revoke per client. An API token is a bearer credential: it works until it is deleted, expires, or is evicted by the account's active-token cap, and nothing tells Muse which of those happened. Naming it muse is what makes it revocable on its own.

Nothing pushes

Muse reads when you ask it to. A note added in Claude is visible to Muse immediately, but Muse is not told about it, so it will not bring it up unprompted.

If Muse is your only assistant, this is a reasonable connection and the notes stay yours either way. If you also use Claude or ChatGPT, connect those over MCP and treat Muse as a second reader of one knowledge base. MCP vs API is the longer version of this argument.

Common questions

FAQ

Does Meta Muse support MCP servers?

Not today. Muse connects through Meta's own Connectors list plus a custom-connector builder that takes an API base URL and credentials, and neither accepts an MCP server address. Muse Spark, the model behind it, is trained for MCP tool use, but that only matters if you are building your own agent on the Meta Model API. For the Muse app, use the REST API.

How does Muse read my Hjarni notes then?

Through a custom connector on the Hjarni REST API, authenticated with a personal API token you create under Settings > Connections. Muse calls the same endpoints a script would: search, read, create, and update notes.

Is a custom connector as good as the MCP connection?

No. MCP clients get tool descriptions, folder-level AI instructions, and the onboarding script from the server itself. A REST connector gets whatever you tell Muse about the API, and it re-reads nothing on its own. If you also use Claude or ChatGPT, connect those over MCP and treat Muse as a second reader of the same notes.

Do I need Pro for this?

No. The REST API works on every plan, including Free. The note cap and the Free file allowance apply the same way they do everywhere else.

Will Hjarni ship a real Muse integration?

The moment Muse accepts an MCP server URL, Hjarni works in it with no new code: the server at https://hjarni.com/mcp is the same one Claude and ChatGPT use. Until then there is nothing to build on our side, which is why this page documents the API route instead of promising a connector.

Need help connecting?

Email evert@hjarni.com and we'll sort it out.

Give your AI a memory. Free.

Connect Claude or ChatGPT to notes they can actually read and write.

Get started free

Give your AI a memory. Free.