Obsidian + Letta

I'm a long-time Obsidian user, and use it as my primary personal knowledge vault. I wanted to show people how to use your Letta agent as a native agent inside Obsidian, through Letta's new ACP integration.

Agent Client Protocol (ACP) is a simple protocol that allows agents to be used in arbitrary clients. If you are familiar with Zed, you may be used to seeing the assistant panel on the right. This panel is powered by ACP -- you can use Claude, Codex, Letta, Grok, etc. all in the same place, using all of Zed's built-in features.

Obsidian also has an ACP connector through the third-party Agent Client plugin, meaning that it is trivial to use Letta in Obsidian directly.

This post quickly walks you through installing the plugin and configuring ACP.

Step 1, install the plugin

Go to Settings > Community Plugins. You should search for "Agent Client" by rait-09. You can also try opening this link. You can also find instructions on their GitHub repository here.

Step 2, get the Letta CLI

ACP requires the Letta CLI:

npm install -g @letta-ai/letta-code
letta

If you are currently conversing with your agent through Letta desktop or web, they should be able to assist you in installing the CLI, so make sure to ask for help if you are stuck.

Step 3, configure your ACP connection

The quickest way to configure ACP for Obsidian is to just ask your agent. Here's a prompt for you.

Configure this Letta agent in my active Obsidian vault using the Agent Client plugin and `@letta-ai/letta-acp`.

Detect the current agent ID, backend, and authentication method. Preserve this agent’s identity and memory. Do not assume `cloud-oauth` or create another agent.

Install and enable Agent Client if needed. Add an entry to the existing `customAgents` array in `<vault>/.obsidian/plugins/agent-client/data.json` using this shape:

{
"id": "letta",
"displayName": "Letta",
"command": "npx",
"args": ["-y", "@letta-ai/letta-acp"],
"env": [
"LETTA_ACP_BACKEND=<detected-backend>",
"LETTA_AGENT_ID=<current-agent-id>"
]
}

Add any fields required for `remote`, but never store API keys in plaintext. Preserve all existing settings and agents. Validate the JSON, reload Agent Client, and verify ACP session initialization without sending a model prompt or modifying notes. Ask me only if you need authentication or must choose between multiple vaults.

For authentication:
- Detect the backend before choosing credentials.
- Use existing secure login or OS Keychain credentials when possible.
- Do not assume the Obsidian process inherits terminal environment variables.
- Never write API keys or capability tokens into `data.json`.
- Verify that the chosen credential can access the target agent. A 404 can mean the credential belongs to another Letta organization.
- For `local`, verify local model-provider access.
- For `cloud-oauth`, use the existing `letta` login and keep tools local.
- For `cloud`, warn that tools run in a cloud sandbox.
- For `remote`, use the configured App Server URL and secure capability-token storage.
- If secure authentication is unavailable or requires browser approval, stop and ask me to complete that step.

Step 3, talk to your agent

Open the Agent Client panel using the robot icon in Obsidian:

Select Letta (or whatever name you used, I set mine to Co) from the agent menu and start a new chat:

The plugin opens the session with your vault as the working directory. Your agent can read and edit notes, follow @note mentions, run commands, and use the same persistent memory it has in the Letta app and CLI:

Each Obsidian chat becomes a separate conversation on the same agent. The conversations stay independent, but they share the agent’s memory.

Comments/PRs/issues welcome! If you are using any of the legacy Letta/Obsidian code, I would recommend switching to the ACP/Agent Client setup outlined in this post.

-- Cameron