Sandbox
@Battam1111/omniseek

Self-hosted MCP server for search, vision, and memory

OmniSeek is an MCP server that lets an agent search across public and logged-in sources, read pages and PDFs, inspect images and video frames, and transcribe audio locally. It also stores retrieval memory and an evidence graph so later searches can build on earlier findings.

49 stars5 forksPythonUpdated 7d ago
Who it's for

Builders who want an agent that can search past plain text, cross languages, and keep evidence over time.

What it delivers

You can get answers from sources that plain search misses, without re-explaining context every session.

What it does

Cross-source search

`omniseek_search` fans out across the catalog, deduplicates results, and ranks them with semantic and lexical matching.

Read pages and documents

`omniseek_read` turns web pages, PDFs, and arXiv links into clean text.

See images and frames

`omniseek_view` reads images, document figures, and video frames with vision.

Local transcription

`omniseek_transcribe` transcribes audio and video locally, with bilingual ASR and timestamp slicing.

Evidence graph and memory

`omniseek_graph`, `omniseek_statement`, and `omniseek_ruling` store and query remembered evidence over time.

Logged-in source access

The walled-source tier can use your own browser session to reach login-protected sites when you opt in.

Source catalog and health

`omniseek_sources`, `omniseek_curator_act`, and `omniseek_curator_view` manage source routing, admission, and retirements.

Claude Code skill

`skills/omniseek-investigate/SKILL.md` packages the investigation workflow as a reusable skill.

How to get it

  1. 1Run
    git clone https://github.com/Battam1111/omniseek.git && cd omniseek
    docker compose up -d
    docker compose logs omniseek        # bearer token printed on first start
    curl -s http://127.0.0.1:8765/healthz
  2. 2Run
    python -m venv .venv && . .venv/bin/activate
    scripts/bootstrap.sh
    python -m omniseek.serve_http

README

OmniSeek

The answer is sitting in minute 47 of a podcast, three replies deep in a comment thread, behind a login, in another language. Your agent gets it anyway.

Self-hosted perception MCP server · one connection

CI  License  Python  Built for MCP  Self-hosted

Quick start · Tools · Configure · Contributing

Languages: English · 中文 · 日本語


Search gives your agent indexed pages, in one language, in text, and stops there.

OmniSeek gives it the senses to keep going: through languages, logins, comment threads, audio, and pixels, all on your machine.

One real investigation, drawn as a descent through three layers. Layer one, written down and in reach: plain search quotes the rule and stops against a buffer stop. Layer two, written down but out of reach: login-walled first-person timelines, and the workaround buried in a comment thread. Layer three, never written down: a Chinese explainer transcribed from audio, and a video note read from pixels. The seek finds a different opening in each layer and arrives at the answer.One real investigation, drawn as a descent through three layers. Layer one, written down and in reach: plain search quotes the rule and stops against a buffer stop. Layer two, written down but out of reach: login-walled first-person timelines, and the workaround buried in a comment thread. Layer three, never written down: a Chinese explainer transcribed from audio, and a video note read from pixels. The seek finds a different opening in each layer and arrives at the answer.

What each layer gave back, verbatim:

  • Written down, and in reach. Headlines, official FAQ, top blogs, all one voice: "From 2026, F-1 admission is limited to a 4-year initial period; renewal in a third country remains possible." All quote the same rule. None of them have done it.
  • Written down, but out of reach. Three first-person threads on 1point3acres, behind your own login: Bangkok, booked to passport in 25 days, interview to approval in 30 minutes; Milan, a month-long fight for a slot, visa issued for 5 years; Tokyo, "silky-smooth". Under the Milan post the author comes back in the comments: "Book any late slot first, then email the consulate to expedite. For one F-1 applicant it worked." One person's experience, not official guidance.
  • Never written down. A Chinese explainer video on bilibili, transcribed locally: the "4-year cap" in the headlines is the initial period, extensions moved desks rather than vanishing. A rednote video note whose caption is four hashtags, frames and speech read locally: a 212(a)(6)(C) refusal abroad, a misrepresentation finding, can nearly close the F-1 road.

Plain search quoted the rule and stopped. The people who had lived it held the timelines, the workaround, and the risk. OmniSeek also named the sources it held back, each with the exact call to drill it.

It hears (local bilingual ASR, no cloud), sees (images and video frames, in-band), crosses languages (a Chinese query finds English results and vice versa), reads behind login walls (your credentials, your machine, off by default), and remembers (persistent retrieval memory plus a typed, source-traced evidence graph).

Crossing languages draws on the index OmniSeek builds as you use it, so a fresh install starts at a floor. The published claim-verification tests run on exactly that fresh install, which makes their cross-lingual number the coldest case rather than the typical one.

Every source in the catalog, the curated roster of everything OmniSeek can reach, earned its place by beating plain search at one of five jobs (structure, unwalling, transcription, recall, monitoring): citation graphs, regulatory filings, login-walled forums, Chinese-language video. And the catalog is built to grow: a curator pipeline probes, judges, and admits new sources, and retires the ones that decay.

Worked examples, real outputs · A full case study · Every claim above is a test (latest results) · Source health, updated weekly


Quick start

Docker (recommended)

git clone https://github.com/Battam1111/omniseek.git && cd omniseek
docker compose up -d
docker compose logs omniseek        # bearer token printed on first start
curl -s http://127.0.0.1:8765/healthz

On success, it returns:

{"ok":true}

Point your MCP client at http://127.0.0.1:8765/mcp with Authorization: Bearer <token>. The token is generated on first start and stored in ~/.omniseek/credentials/omniseek_http.json (with the compose file, that's ./.omniseek/credentials/omniseek_http.json on the host).

Two paths from here. The prebuilt core image (docker pull ghcr.io/battam1111/omniseek, amd64 + arm64) needs no build and carries every core sense; it is Apache-clean and ships without PDF reading, hearing (ASR + video frames), and login-walled sources. Wanting those extras is what triggers a local build: set EXTRAS="[pdf,asr,walled]" and run docker compose build, then up -d (the first build also fetches headless Chromium; later starts are instant). Optional but recommended: set OMNISEEK_CONTACT_EMAIL for a faster lane with Crossref, SEC, and Unpaywall.

Without Docker

python -m venv .venv && . .venv/bin/activate
scripts/bootstrap.sh
python -m omniseek.serve_http

The bare install is the Core tier: every keyless API and static source, document reading minus PDF, and the lexical memory index. pip install "omniseek[pdf,asr,recall,ocr]" wakes the Research tier (PDF, hearing, cross-lingual vectors, OCR); omniseek[walled] adds the login-walled tier, which stays off until you bring your own accounts; omniseek[all] takes everything. The server prints which senses are online, and which are dormant, at every boot.

On Windows, run bootstrap.sh under Git Bash or WSL; Docker is the simplest path. For an always-on Linux service, see deploy/omniseek.service.

Prefer stdio? The install also ships an omniseek command that speaks MCP over stdio, for clients that launch servers themselves; Dockerfile.stdio wraps the same thing in a container.

OmniSeek binds 127.0.0.1 and requires the bearer token on every request. Do not expose without a reverse proxy (SECURITY.md).


Tools

One MCP connection; no model, no agent loop inside. Your model thinks, your harness drives the loop, OmniSeek reaches. Start with omniseek_search; explore what's available with omniseek_sources.

ToolWhat it does
omniseek_searchFan out across the whole catalog, deduplicate, rank. Cross-lingual (semantic + lexical).
omniseek_readNormalize any URL or document (web page, PDF, arXiv) into clean text.
omniseek_viewRead images, document figures, video frames with vision.
omniseek_transcribeTranscribe audio/video locally. Bilingual ASR, sliceable by timestamp.
omniseek_field_skeletonMap a research field's citation neighborhood: foundational core vs. frontier.
omniseek_resolve_identityResolve a person's name to candidate author IDs across databases.
omniseek_coauthorsMap a researcher's collaboration network by joint-paper count.
omniseek_institution_cohortList who actively publishes at a lab, scoped to a field.
omniseek_paper_enrichOpen-access PDF, retraction/integrity status, citation count for a paper.
omniseek_paper_recommendSemantically similar papers (SPECTER embeddings) that keyword search misses.
omniseek_graphQuery the accumulated evidence graph: find, neighborhood, between, since, similar.
omniseek_sensorStanding queries with novelty detection. Only tells you what is new.
omniseek_rulingRecord identity judgments (same/not-same) the graph applies at read time.
omniseek_statementRecord directed relations the graph carries forward.
omniseek_curator_actSource lifecycle: submit, probe, judge, admit, retire.
omniseek_curator_viewRead the source-admission queue or a per-source audit dossier.
omniseek_gatherRun multiple tools in parallel, one response.
omniseek_sourcesList and route: domains, regions, capabilities, health.

The login-walled tier has no tool of its own: once you opt in per source, the same omniseek_search(..., sources=["xiaohongshu"], raw=True) runs through your own logged-in browser. See walled sources.

Full reference in tools.md · FAQ

Using Claude Code? skills/omniseek-investigate ships the investigation methodology (sweep, zoom, structure) as a ready-made skill.


Configure

OmniSeek is catalog-first: with no config, every benign source is on and login-walled sources are off. Tune in one file, ~/.omniseek/profile.json (example):

TierDefault
free (public, no key)on
keyed (a free or paid API key you supply)on once the key is set
walled (a login you hold)off; you bring your own browser
circumventionoff; none in the default pack

Full reference: configuration · walled sources · legal posture


Why self-hosted

There is no OmniSeek cloud. No telemetry, no accounts, no relay: a query leaves your machine only as direct requests to the sources you enabled, and OmniSeek adds no other party to that path. Walled-source credentials stay in your own browser, presented only to the site they belong to; OmniSeek never stores, uploads, or even sees your passwords. The retrieval memory and evidence graph it accumulates over months are local files you own: stop running OmniSeek and you keep everything. Not a feature toggle. The architecture.


Contributing

See CONTRIBUTING.md. The bar for a new source: it must beat plain web search via a mode (structure / unwall / transcribe / recall / monitor). The bar for fixing a decayed source: low, please do. python tests/smoke.py before you push.

By participating you agree to the Code of Conduct.


Your agent seeks what search can't find.

Apache-2.0 · NOTICE · Security · Cite

Files in the repo

Repository payload28 top-level entries
  • .github
  • assets
  • bench
  • deploy
  • docs
  • scripts
  • site
  • skills
  • src
  • tests
  • .dockerignore
  • .editorconfig
  • .gitattributes
  • .gitignore
  • CHANGELOG.md
  • CITATION.cff
  • docker-compose.yml
  • Dockerfile
  • Dockerfile.stdio
  • FINDINGS.md
  • glama.json
  • LICENSE
  • llms-install.md
  • NOTICE
  • pyproject.toml
  • README.md
  • REPORT.md
  • server.json

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface

86k

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
2akouwu/
reverify

Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k
t8y2/dbxConnectors

20 MB lightweight cross-platform database client for 90+ databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具,支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90+ 数据库,提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。

19k