hermes-knowledge-ingestion

hermes-knowledge-ingestion

Enables saving URLs, local files, plain text, and platform content (WeChat, X, YouTube, PDF, images, audio/video, Telegram) as structured Markdown knowledge cards in an Obsidian vault, with optional AI-powered classification and tagging.

Category
Visit Server

README

Knowledge Inbox

English | 简体中文

Harness-neutral, local-first knowledge ingestion for Obsidian and other local retrieval tools. It turns links, text, videos, screenshots, PDFs, and local files into structured Markdown knowledge cards. Hermes, Codex, OpenClaw, and other MCP clients share the same adapters and processing service.

Current release: 0.3.0. Web and file ingestion run cross-platform. WeChat Channels downloading is an optional, experimental macOS integration that requires the desktop WeChat client and a local TLS proxy.

How it works

Hermes / Codex / OpenClaw / CLI / Web / Telegram
                  |
              MCP / FastAPI
                  |
             Source Adapter
                  |
             ContentItem
                  |
       Cleaner / OCR / Whisper / AI
                  |
      Classifier / Tags / Knowledge Linker
                  |
          Obsidian Markdown + SQLite

Every source is normalized into a ContentItem. To add a platform, implement SourceAdapter.detect() and SourceAdapter.fetch(), then register the adapter in backend/adapters/registry.py.

Supported sources

Source Input Capabilities
Web pages, blogs, and news URL Readability extraction, Markdown conversion, and image download
WeChat Official Accounts URL Article body, author, and images; can also be synced by another tool
X / Twitter Post URL Current post, visible parent context, quoted content, and media when available
YouTube URL Captions first; Whisper fallback when captions are unavailable
Podcast RSS and Apple Podcasts Feed or episode URL Episode metadata, Podcasting 2.0 transcript, audio download, and Whisper fallback
Vimeo URL oEmbed metadata, captions when available, and Whisper fallback
Direct audio, video, and HLS Media URL Streaming download for common media files; yt-dlp resolution for .m3u8
PDF File Text extraction; OCR for scanned pages with the media extra
Images File OCR plus visual and chart descriptions when a vision model is configured
Audio and video File Whisper transcription or vision-model understanding
WeChat Channels Share URL Experimental macOS integration, or upload the original video directly
Telegram Webhook Text, captions, or the first URL found in a message

Quick start

Python 3.11 or newer is required. Media processing requires ffmpeg; OCR requires Tesseract.

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[media,browser,mcp,dev]"
playwright install chromium
cp config.example.yaml config.yaml
uvicorn backend.main:app --host 127.0.0.1 --port 8787

Open http://127.0.0.1:8787 for the universal inbox: paste a link or text, or drop a video, screenshot, PDF, or local file into the same input area. Source detection, AI processing, classification, tags, linking, and Obsidian output are automatic. Use the EN / 中 button to switch the web interface. Completed entries under Recently generated can be clicked to open their knowledge-card folder in the system file manager.

On first launch on macOS, choose an existing Obsidian Vault or Markdown folder with the native folder picker, then choose the card subfolder. The service verifies write access and stores only these two values in the ignored local file data/storage.yaml. Use Settings later to change them. When OBSIDIAN_VAULT_DIR is set by Docker or an administrator, the web setting is read-only. Other host platforms can use the absolute-path fallback in the same dialog.

On mobile, the primary workflow is Telegram, Discord, or another IM connected to an Agent Harness. Forward a standalone link or file and the Harness calls knowledge_ingest; no web form or extra “save this” message is required. Links included as context for ordinary questions are not archived automatically. A browser extension for one-click desktop capture is a natural next client, but is not included yet.

You can also use the CLI:

.venv/bin/python scripts/ingest.py 'https://example.com/article'
.venv/bin/python scripts/ingest.py 'https://feeds.example.com/show.rss'
.venv/bin/python scripts/ingest.py 'https://vimeo.com/123456'
.venv/bin/python scripts/ingest.py '/absolute/path/file.pdf'
.venv/bin/python scripts/ingest.py 'A note to keep' --title 'Quick note'

The same pipeline is available through the API:

curl -X POST http://127.0.0.1:8787/api/ingest \
  -H 'content-type: application/json' \
  -d '{"url":"https://example.com/article"}'

Configure AI and Obsidian

The AI layer uses an OpenAI-compatible Chat Completions endpoint. AI is disabled by default; without a model the system still creates a local fallback summary. Enable AI for classification, visual understanding, and richer tags:

export OBSIDIAN_VAULT_DIR=/absolute/path/to/ObsidianVault
export AI_ENABLED=true
export OPENAI_BASE_URL=http://127.0.0.1:11434/v1
export OPENAI_API_KEY=''
export OPENAI_MODEL=qwen2.5:7b
export OPENAI_VISION_MODEL=your-vision-model

You can set the same values in config.yaml. The config file, .env, database, browser login state, and downloaded media are ignored by Git.

Knowledge linking uses qmd when available. If qmd is not installed, it falls back to lexical matching over the latest 1,000 Markdown notes in the Vault. Cards are written to a temporary file and atomically replaced so an indexer never sees a partial note.

MCP tools and Harness clients

scripts/knowledge_mcp.py is a harness-neutral stdio MCP server. It exposes:

  • knowledge_ingest: ingest a URL, local file, or text and wait for the knowledge card to finish.
  • knowledge_get_job: inspect the current state of a known ingestion job.
  • knowledge_list_capabilities: list supported sources and input types.
  • knowledge_wechat_prepare: refresh the local WeChat Channels window only when the client connection needs recovery.

Each Harness launches the same server with a Python environment that includes the hermes extra and the absolute path to scripts/knowledge_mcp.py. Client-specific Skills are in clients/hermes, clients/codex, and clients/openclaw; they contain routing guidance, not duplicate adapters. See clients/README.md for installation commands.

Docker

cp .env.example .env
docker compose up --build

Docker is suitable for web pages, files, OCR, transcription, and the AI pipeline. When the workflow needs the macOS WeChat client, system proxy, or a GUI browser login, run the backend directly on the host. Compose binds the service to 127.0.0.1:8787.

WeChat Channels security boundary

The Channels integration uses the separately maintained ltaoo/wx_channels_download project. Its license and security boundary are separate from this repository. This project does not distribute its binary, root certificate, cookies, or WeChat login data. See integrations/wechat-channels/README.md for installation, licensing, proxy, and macOS permission details.

The downloader creates a local TLS proxy. Use only a trusted, checksum-verified build and never expose the downloader or this service to a LAN. The MCP tool temporarily switches the HTTP/HTTPS proxy for the task and restores the previous settings afterward. The original video is deleted only after both the Obsidian note and SQLite record have been written successfully.

Verification

pytest -q
ruff check backend scripts tests

The test suite covers Markdown formatting, task recovery, text end-to-end ingestion, X context, the WeChat Channels adapter, video transcoding, post-write cleanup, and input classification. Real platform pages and login sessions change over time, so production deployments should still perform a separate end-to-end check for each platform they use.

Contributing and license

Read CONTRIBUTING.md and SECURITY.md before submitting a change. Original project code is licensed under Apache-2.0. Optional third-party components remain under their own licenses; see THIRD_PARTY_NOTICES.md.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured