agent-skills
Retrieval-only MCP server that turns any knowledge source (Obsidian vault, notes, reference sets) into searchable Qdrant-backed skills, exposing list_skills, search_vault, and search_skill tools for agents to query via stdio or SSE.
README
agent-skills
Modular RAG skills for a self-hosted LLM agent, backed by Qdrant.
Most "chat with your Obsidian vault" projects embed a vector store inside the Obsidian app and stop there. This is a different shape. Any knowledge source (an Obsidian vault, a folder of notes, a reference set) becomes a skill the agent can search, all behind one interface. It targets a standalone agent (Ollama, an agent gateway, an MCP client) instead of living inside the note-taking app.
The Obsidian vault indexer is the main worked example. It is one skill, not the whole project.
The core idea: a skill is three things
skill = (Qdrant collection) + (manifest: where the docs live + how to chunk) + (retrieval hook)
Everything downstream is generic. Adding a knowledge skill is a manifest, not a rewrite:
NOTES = SkillManifest(name="work_notes", source_glob="~/notes/work/**/*.md")
register(NOTES) # chunk -> embed -> upsert
retrieve(NOTES.name, q) # embed query -> search -> context block
Architecture
sources ingestion Qdrant agent
vault / ----> chunk + embed ----> one collection ----> gateway / MCP
notes / (via Ollama) per skill injects context,
reference sets then answers
What the vault skill handles
The Obsidian loader (agent_skills/vault.py) does not treat notes as flat text:
- YAML frontmatter is parsed into payload metadata, not embedded as prose.
[[wikilinks]]are flattened to their display text for the embedding, and kept as alinkslist in the payload for graph-aware retrieval.#tags(inline and frontmatter) become filterable payload metadata.- Image embeds (
![[...]]) are dropped before embedding. - Incremental sync: each note is SHA-256 hashed, only changed notes are re-embedded, deleted notes are purged. The collection is not wiped per run.
- Deterministic chunk IDs (
uuid5(path:index)) so edits overwrite cleanly instead of duplicating.
Quickstart
pip install -r requirements.txt
# 1. bring up Qdrant locally
docker run -p 6333:6333 -v $(pwd)/qdrant_storage:/qdrant/storage qdrant/qdrant
# 2. pull an embedding model in Ollama
ollama pull nomic-embed-text
# 3. set VAULT_PATH in agent_skills/config.py, then index
python examples/index_vault.py sync
# 4. query
python examples/index_vault.py ask "how did I configure the network?"
Add your own skill
- Copy
examples/register_notes.py. - Write a
SkillManifestpointing at your docs. register()it. It is now a collection the agent queries like any other.
Plug into an agent (MCP)
examples/mcp_server.py exposes retrieval as MCP tools (list_skills,
search_vault, search_skill), so an MCP client can query the knowledge. The
surface is read-only: it retrieves, it does not write or take actions.
pip install "mcp[cli]"
python examples/mcp_server.py # stdio, for local MCP clients
For a local client (Claude Code, Cursor, Claude Desktop), point its MCP config at the script:
{
"mcpServers": {
"agent-skills": {
"command": "python",
"args": ["/absolute/path/to/examples/mcp_server.py"]
}
}
}
For a networked gateway, switch the transport to sse at the bottom of
mcp_server.py and point the gateway at http://<host>:8000/sse. The agent
calls search_vault(...), the tool returns a context block, and the gateway
feeds it into the model's context.
Config
Everything lives in agent_skills/config.py: Ollama URL, embedding model and
dimension, Qdrant host/port, chunk size and overlap. Swap the embedder freely,
but keep EMBED_DIM matched to the model or the upsert will reject.
Notes
- Local-first. Embeddings run on your own Ollama host; nothing leaves the network.
- Retrieval only. This gives an agent knowledge to reason over. It does not hand the agent tools to act on the world.
- Not an Obsidian plugin. It reads the vault as files; it does not run in the app.
- Early stage: the code is organized and syntax-clean, but run it against a live Qdrant and Ollama before relying on it.
License
MIT. See LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。