MCP¶
ailoud mcp serves your library to an AI agent over
MCP. The agent can search it, summarise it
and tag it.
Set it up¶
The quickest way is to let AILoud do it:
ailoud mcp install
It asks which agents to configure, with the ones it found on your machine pre-selected:
Which agents should AILoud configure?
Claude Code (detected)
Codex CLI (detected)
opencode (detected)
Gemini CLI (not found)
Hermes Agent (not found) -- global only
GitHub Copilot CLI (detected) -- global only
Then where to put it:
Where should it be configured?
This project only config files in this directory
Globally every project on this machine
Non-interactively:
ailoud mcp install --target claude,codex --location local
ailoud mcp install --target auto --location global --yes
It writes two things per agent: the MCP registration, and a rules block in the
agent's instructions file so it uses the tools well. The block is delimited by
<!-- AILOUD_START --> and <!-- AILOUD_END -->; nothing outside the markers
is touched, and installing twice changes no bytes.
For a per-project install it also creates .ailoud/, where that project's
recordings live. See the project library.
Update and remove¶
ailoud mcp update # refresh the block after upgrading AILoud
ailoud mcp uninstall # remove the registration and the block
ailoud mcp uninstall --target claude --location local
update touches only agents that are already configured; it never adds a new
one. uninstall deletes a config file AILoud created, edits one that holds
other servers, and leaves .ailoud/ alone.
Your own files are safe:
- Only the text between the two markers is ever rewritten. A file that merely
mentions
<!-- AILOUD_START -->in prose keeps everything around it. - A
config.tomlthat already defines anailoudserver some other way is refused, not edited. Two definitions of one key is a TOML error, and it would break your whole Codex config rather than just this server. - A Hermes
config.yamlholding your own settings or comments is rewritten, never deleted. Only a file with nothing but AILoud's keys in it is removed. - A trailing comma or a byte-order mark in a
.jsoncis tolerated. A file that is not JSON at all is refused with a message rather than rewritten.
Note
Comments in a JSON or .jsonc MCP config do not survive an edit -- the file
is parsed and re-serialised. TOML and YAML keep theirs.
Supported agents¶
| Agent | Scopes | Config | Rules file |
|---|---|---|---|
claude |
project, global | .mcp.json / ~/.claude.json |
CLAUDE.md |
codex |
project, global | .codex/config.toml |
AGENTS.md |
opencode |
project, global | opencode.jsonc |
AGENTS.md |
gemini |
project, global | .gemini/settings.json |
GEMINI.md |
hermes |
global only | ~/.hermes/config.yaml |
~/.hermes/AGENTS.md |
copilot |
global only | ~/.copilot/mcp-config.json |
~/.copilot/copilot-instructions.md |
The project library¶
A directory named .ailoud/ makes that project's recordings separate from
your personal collection. AILoud finds it by walking up from the working
directory, the way git finds .git, so it works from any subdirectory.
ailoud mcp install --location local # creates it
ailoud doctor # shows which library is in use
The directory carries a .gitignore that excludes its own contents, so the
database and the media copies never reach git while the directory itself can
be committed.
The config file stays per-user either way. It names installed binaries and model files, which are not a property of a project.
By hand¶
.mcp.json in your project, or ~/.claude.json for every project:
{
"mcpServers": {
"ailoud": { "command": "ailoud", "args": ["mcp"] }
}
}
claude_desktop_config.json:
{
"mcpServers": {
"ailoud": { "command": "ailoud", "args": ["mcp"] }
}
}
opencode.jsonc:
{
"mcp": {
"ailoud": {
"type": "local",
"command": ["ailoud", "mcp"],
"enabled": true
}
}
}
Run ailoud mcp and speak MCP over stdio.
Check it works:
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' | ailoud mcp
It serves the same library the CLI uses. Anything you import in the shell is visible to the agent, and the other way round.
Ask it things¶
Which of my standups mentioned the rollback?
Summarise last week's 1:1 with Ben. He is my report.
Tag the untagged recordings for me.
Tools¶
Reading
| Tool | Returns |
|---|---|
list_recordings |
the library, with tags and whether a transcript exists |
list_untagged |
recordings that cannot be filtered by context yet |
list_tags |
every tag, with counts |
search_transcripts |
matching lines with timestamps and speakers |
get_transcript |
a file path, not the text |
list_speakers |
who spoke, and their names |
list_reports |
saved summaries |
get_report |
a file path |
list_templates |
the summary shapes available |
Writing
| Tool | Does |
|---|---|
annotate |
titles, notes, tags, speaker names |
import_recording |
adds files to the library |
transcribe |
runs speech-to-text |
summarize |
writes and saves a report |
create_template |
adds a summary shape |
Deleting
| Tool | Does |
|---|---|
delete_recording |
two calls; see below |
delete_report |
two calls |
How it behaves¶
The server tells the agent four rules before its first call.
Tag everything. Tags are the only way to ask for "the recordings about this
project". list_recordings flags untagged ones and counts them, and
list_untagged exists so an agent can offer to fix them.
Search before reading. search_transcripts answers "where was this
discussed" in a few hundred bytes. Reading a transcript costs thousands of
tokens.
Transcripts arrive as files. get_transcript writes a temporary file and
returns the path, the line count and the duration. The agent reads the part it
needs with its own tools. The directory is removed when the server stops.
Context lives in the agent's memory. summarize takes a short context;
AILoud does not remember it between calls. The agent keeps it and passes it
again.
Deleting takes two calls¶
The first call deletes nothing. It describes what would go and returns a token:
{
"status": "confirmation required",
"willDelete": [{ "id": "01M1B2...", "title": "Backend standup", "tags": ["standup"] }],
"notDeleted": "the original files these were imported from",
"recoverable": false,
"confirmationToken": "6f1c...",
"nextStep": "Show willDelete to the user. If they agree, call again with this confirmationToken."
}
Only a second call carrying that token deletes anything.
The token is single-use, expires in ten minutes, lives only in the server
process, and is bound to the exact ids it was issued for. The tools also carry
destructiveHint, so a client that gates destructive tools gates these.
Prompts¶
| Prompt | Does |
|---|---|
catch-up |
answers a question the cheap way: search, then read only what it points at |
tidy-library |
finds untagged recordings and proposes tags |
summarise-properly |
picks a template, checks for an existing report, passes context |
Resources¶
Transcripts and reports are addressable, with id completion:
ailoud://recording/{id}/transcript
ailoud://report/{id}
For clients that let you attach context directly.