Skip to main content
Glama

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.

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

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).


Related MCP server: Augent

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.

Tool

What it does

omniseek_search

Fan out across the whole catalog, deduplicate, rank. Cross-lingual (semantic + lexical).

omniseek_read

Normalize any URL or document (web page, PDF, arXiv) into clean text.

omniseek_view

Read images, document figures, video frames with vision.

omniseek_transcribe

Transcribe audio/video locally. Bilingual ASR, sliceable by timestamp.

omniseek_field_skeleton

Map a research field's citation neighborhood: foundational core vs. frontier.

omniseek_resolve_identity

Resolve a person's name to candidate author IDs across databases.

omniseek_coauthors

Map a researcher's collaboration network by joint-paper count.

omniseek_institution_cohort

List who actively publishes at a lab, scoped to a field.

omniseek_paper_enrich

Open-access PDF, retraction/integrity status, citation count for a paper.

omniseek_paper_recommend

Semantically similar papers (SPECTER embeddings) that keyword search misses.

omniseek_graph

Query the accumulated evidence graph: find, neighborhood, between, since, similar.

omniseek_sensor

Standing queries with novelty detection. Only tells you what is new.

omniseek_ruling

Record identity judgments (same/not-same) the graph applies at read time.

omniseek_statement

Record directed relations the graph carries forward.

omniseek_curator_act

Source lifecycle: submit, probe, judge, admit, retire.

omniseek_curator_view

Read the source-admission queue or a per-source audit dossier.

omniseek_gather

Run multiple tools in parallel, one response.

omniseek_sources

List 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):

Tier

Default

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

circumvention

off; 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

Available Tools

18 tools
omniseek_coauthorsA

Use WHEN you want WHO a researcher collaborates with — advisor + closest collaborators by joint-paper count, or how a paper's author group is connected (WebSearch cannot build this). One LAYER, not the whole graph — co-authorship is one edge type; YOU overlay the others (advising, institution cohort, citation, code, social) and judge what each connection MEANS.

Fully-qualified MCP name: mcp__omniseek__omniseek_coauthors (server name is omniseek; there is no omniseek-eye server).

Pass author NAMES and/or ids (from omniseek_resolve_identity). A brand-new arXiv paper is not in the graph yet, so this reconstructs from each author's PRIOR work: • N=1 -> that author's frequency-ranked coauthor neighborhood. The advisor + closest collaborators surface by joint-paper count (e.g. Yi R. Fung -> Heng Ji ~51x = her PhD advisor, no advisor field needed — YOU read that signal). • N>1 (e.g. a paper's whole author list) -> additionally the PAIRWISE prior joint-work edges among them (with the actual joint paper titles as evidence) + BRIDGE collaborators (people who co-authored with >=2 of the inputs but are not in the set). This is the "how is this author group actually connected" reconstruction.

Each input may be a NAME, an id, or '+'-joined ids ("id1+id2") for ONE person SPLIT across ids — their works are MERGED (OpenAlex/S2 routinely split a junior's recent papers; merging recovers the complete network). Each becomes a node with resolved, ambiguous + alternatives (juniors often need source="s2", a paper anchor, or an explicit id — the node note says so when unresolved). The output also carries cooc: which of the network's top external coauthors co-appear on the same papers, i.e. the SUB-COMMUNITY structure (an ego's distinct 'research worlds'). Mechanical throughout: "these two share these N papers" is a fact; advisor-vs-peer, what a cluster MEANS, is YOUR judgment. For the citation/influence layer use omniseek_field_skeleton; for the others, assemble from the dossier recipe (github, bluesky, exa, cdp_fulltext, omniseek_read).

hints / papers are parallel lists for per-author disambiguation (an institution hint, or a known paper that pins a common-name junior).

Returns: {source, n_authors, nodes:[{query, resolved, ambiguous, alternatives, works_seen, top_coauthors:[{id,name,joint}], degraded?}], edges:[{a,b,joint_count,papers:[{title,year,id}]}], bridges:[{id,name,shared_by,total_joint}], cooc:[{a,b,n}], degraded?}. (top_coauthors/bridges carry a representative id you can harvest and pass back to omniseek_coauthors to drill that person.) A top-level/node degraded means that author's OpenAlex lookup FAILED (rate-limited / upstream down): an empty graph is then missing-data to RETRY, not "no collaborators".

ParametersJSON Schema
NameRequiredDescriptionDefault
hintsNo
papersNo
sourceNoopenalex
authorsYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure, and it delivers extensively. It explains that the tool reconstructs from PRIOR work, merges '+'-joined ids for split author profiles, reports ambiguity and alternatives, and includes a 'degraded' flag meaning the graph is missing data and should be retried. It also clarifies what is mechanical fact versus the agent's judgment.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense, front-loaded with purpose and usage modes before detailing disambiguation and output structure. Every sentence earns its place given the 0% schema coverage, no output schema, and the tool's complex graph semantics. The use of bullets and a return-shape block keeps the length navigable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex graph-returning tool with no output schema and minimal input schema, the description is remarkably complete: input formats, disambiguation mechanisms, N=1 vs N>1 behavior, bridge collaborators, cooc sub-communities, output fields, failure semantics, retry guidance, and drill-down instruction. An agent has everything needed to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description fully compensates for all four parameters. It defines 'authors' as names, ids, or '+'-joined ids from omniseek_resolve_identity; 'hints'/'papers' as parallel per-author disambiguation lists; and 'source' with concrete guidance like source='s2' for juniors. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific, actionable purpose: 'Use WHEN you want WHO a researcher collaborates with — advisor + closest collaborators by joint-paper count, or how a paper's author group is connected.' It clearly distinguishes the tool from WebSearch and sibling omniseek_field_skeleton, and positions it as 'one LAYER, not the whole graph.' An agent can immediately tell what resource and relationship this tool operates on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: co-authorship exploration, advisor discovery, and author-group connectivity. It also states explicitly what NOT to use it for: 'For the citation/influence layer use omniseek_field_skeleton; for the others, assemble from the dossier recipe.' It even distinguishes N=1 vs N>1 cases and references omniseek_resolve_identity for ID inputs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_curator_actA

Use WHEN acting on the source-curation protocol — WRITE a source-lifecycle action (submit / probe / decide / admit / retire ...); every safety gate lives in the impl, unchanged. Pick the action with verb; each verb's REQUIRED args (see the /curator protocol):

Fully-qualified MCP name: mcp__omniseek__omniseek_curator_act (server name is omniseek; there is no omniseek-eye server).

• submit (name, urls, mode, domain, family; optional kind, regions, rationale, draft) -> add a CANDIDATE source to the admission backlog. mode ∈ STRUCTURE/UNWALL/TRANSCRIBE/RECALL/MONITOR. draft (foundry-grade) is a WORKING artifact ({"row", "fixture", "probe_summary"}) surfaced in the packet and preferred as stage_commit's ready-to-paste block. • probe (candidate_id) -> run the MECHANICAL evidence-gatherers, persist + return the packet. • wall_probe (candidate_id) -> P2 re-probe: RENDER the candidate in the network-isolated jail (egress only via the SSRF-pin proxy) so a source whose real content the plain-HTTP probe MISSED (client-rendered SPA / anti-bot / soft-login-wall) is measured on its REAL content. Eligible on a parked_p2 candidate OR an awaiting_verdict one YOU judge to be a client-rendered shell (WHEN to spend a render is your call, not an auto-gate). Surfaces content -> lands in awaiting_verdict on the rendered packet (parked_p2 revives, awaiting_verdict re-enriches); nothing -> stays put with the reason. Facts are render-derived (M7): the code never admits, only surfaces. • decide (candidate_id, decision, reasons; baseline_ref required to admit) -> record the admit/watch/reject verdict. MECHANICALLY REFUSES an admit on hard red-line / incomplete evidence / empty baseline_ref / no packet. admit -> owner_review; watch -> watching; reject -> rejected. • apply_live (candidate_id) -> ONE-TAP LIVE ADMIT (rss-safe subclass only): a REVERSIBLE overlay row + live re-register, NO git. Non-auto families are refused (use stage_commit). • rollback_live (name, family) -> full revert of a live-applied overlay row (unregister + drop). • stage_commit (candidate_id) -> ONE-TAP STAGED COMMIT for the NON-auto subclass: prepares the git commit text (does NOT apply); the operator does the git add / commit / deploy by hand. When the candidate has a foundry draft, the draft row IS the ready-to-paste block (+ a provenance line). • retire_live (name; confirm) -> ONE-TAP PRUNE (needs an existing PRUNE verdict): confirm=False previews; confirm=True writes a reversible runtime explicit_only override + stages the git commit. • rollback_retire (name) -> drop the runtime retire override so the source rejoins the fan-out. • source_verdict (name, verdict, rationale; prune_class, coverage_impact) -> record KEEP / WATCH / PRUNE for an EXISTING source. MECHANICALLY REFUSES a PRUNE the source's safety flags forbid.

Unknown verb returns an error dict listing the valid values.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
modeNo
nameNo
urlsNo
verbYes
draftNo
domainNo
familyNo
confirmNo
reasonsNo
regionsNo
verdictNo
decisionNo
rationaleNo
prune_classNo
baseline_refNo
candidate_idNo
coverage_impactNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so extensively. It discloses safety gates ('every safety gate lives in the impl, unchanged'), mechanical refusals ('MECHANICALLY REFUSES an admit on hard red-line / incomplete evidence'), reversibility for live actions ('REVERSIBLE overlay row'), and side-effect boundaries ('does NOT apply', 'does NOT admit, only surfaces'). It also clarifies that stage_commit only prepares text and does not apply it, and that wall_probe only surfaces content and never admits. These details go well beyond a simple action description and are highly valuable for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with each verb on its own line, making it scannable. It front-loads the purpose and then breaks down actions logically. While it is verbose, the complexity of 18 parameters and multiple verbs justifies the length. There is some redundancy (e.g., repeating the fully-qualified name), but overall it is efficient for the information density required.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is nearly complete. It covers all verbs, required parameters, safety gates, and side effects. It also clarifies the fully-qualified MCP name. The main gap is that it does not explicitly describe the return value for successful calls (though it mentions 'packet' for probe and wall_probe, and an error dict for unknown verbs). Since there is no output schema, this would be helpful but is not critical for correct invocation. Overall, it provides enough context for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does thoroughly. For each verb, it lists the required parameters (e.g., submit requires name, urls, mode, domain, family; optional kind, regions, rationale, draft) and explains their semantics (e.g., mode enum values, draft as a working artifact, baseline_ref required for admit). It also explains how parameters affect behavior (e.g., confirm for retire_live toggles preview vs. write). This gives an agent clear meaning for all 18 parameters, even though they are not individually documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific statement: 'Use WHEN acting on the source-curation protocol — WRITE a source-lifecycle action'. It names the resource (source-curation protocol) and the action class (write lifecycle actions), and lists all specific verbs (submit, probe, decide, etc.), making it immediately distinguishable from sibling tools like omniseek_curator_view or omniseek_sources, which are read-oriented. The distinction is further reinforced by explicitly saying 'WRITE'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('WHEN acting on the source-curation protocol') and provides per-verb guidance on when each action is appropriate. For example, it explains that wall_probe is for client-rendered shells and that apply_live is only for rss-safe subclass, while stage_commit is for non-auto families. It also notes that non-auto families are refused and directs to stage_commit as the alternative, and even clarifies that there is no 'omniseek-eye' server to avoid confusion. This gives an agent explicit routing among verbs and implies when not to use the tool (for reads).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_curator_viewA

Use WHEN running the source-curation protocol (judge the admission queue or a source audit) — READ curator state: queue | packet | audit. Never mutates. Pick a view with what:

Fully-qualified MCP name: mcp__omniseek__omniseek_curator_view (server name is omniseek; there is no omniseek-eye server).

• what="queue" -> the candidate-admission backlog (optionally filtered by state: new / probed / awaiting_verdict / admitted / watching / rejected / owner_review / redline_blocked / parked_p2 / error). The judging agent's entry point: list awaiting_verdict, then view each packet. See the /curator protocol. • what="packet" -> the last-built evidence packet for candidate_id (a fresh agent picks it up cold); {"error": ...}/{"state": ...} if none built yet. A foundry-grade draft (the submitter's WORKING row + fixture + probe summary) is surfaced verbatim under draft. • what="audit" -> the per-source NEUTRAL audit dossier (P3): facts + LABELED descriptive ratios

  • the mechanical safety flags per source, NO verdict key. Read this, then render KEEP / WATCH / PRUNE via omniseek_curator_act(verb="source_verdict", ...).

Unknown what returns an error dict listing the valid values.

ParametersJSON Schema
NameRequiredDescriptionDefault
whatYes
stateNo
candidate_idNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly: it states 'Never mutates,' describes what each view returns, explains the error behavior for unknown 'what', and specifies the exact structure of the audit dossier (facts, ratios, safety flags, no verdict key). This is transparent about side effects and outputs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-organized with bold labels and bullet points, front-loading the key usage directive. Every sentence adds necessary detail, though some redundancy exists (e.g., repeating the server name). It is not excessively verbose but is longer than minimal; still, the structure makes it scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (three views, multiple states, integration with another tool), the description is complete: it covers the entry point, output formats, error handling, and the follow-up action via omniseek_curator_act. Without an output schema, it explains what to expect for each view, leaving no critical gap for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no parameter descriptions (0% coverage), so the description must define all parameters. It does so comprehensively: 'what' is explained with its three valid values and their meaning, 'state' is listed with its filter options for the queue view, and 'candidate_id' is tied to the packet view. Unknown values are also handled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear directive ('Use WHEN running the source-curation protocol') and names the specific resource (curator state) with three distinct views (queue, packet, audit). It also differentiates from the sibling action tool omniseek_curator_act, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool (during curation protocol), and for each view it explains the scenario (e.g., 'list awaiting_verdict' for queue, 'last-built evidence packet' for packet, 'render KEEP / WATCH / PRUNE' via the act tool for audit). It also notes that unknown values return an error listing valid options, guiding correct use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_field_skeletonA

Map a research field's shape — use WHEN you need its citation neighborhood (foundational core by citations vs frontier by date) to cluster yourself, from a topic or seed papers.

Fully-qualified MCP name: mcp__omniseek__omniseek_field_skeleton (server name is omniseek; there is no omniseek-eye server).

A thin graph primitive, NO judgment: given query (auto-picks top-relevance seeds) or seeds (OpenAlex work-ids YOU chose as anchors — preferred once you know the field), it returns the field's complete citation neighborhood: every node with raw metadata, date, and ONE signal in_degree (how many in-field papers cite it).

YOU are the cartographer — do ALL the intelligence over this raw data: • SEEDS: if the auto-seeds are off (e.g. a generic survey crept in), re-call with seeds=[...] you pick from the nodes. • SOURCE: source="openalex" (default, rich for established fields) or source="s2" (Semantic Scholar — far better arXiv coverage + accurate citation counts; use it for recent/bleeding-edge fields where OpenAlex's graph is sparse). s2 nodes also carry influential (S2 flags the citation link to a seed as substantive, not a drive-by) and intent (methodology/background/result, when S2 classified it): strong cues for what to read first, and contexts ([{snippet, intents}]: the RAW citing SENTENCE(s) S2 extracted). READ a snippet to judge a citation's POLARITY yourself (does the citer SUPPORT, CONTRAST/refute, or merely MENTION the seed): OmniSeek exposes the sentence, YOU classify; S2 has no polarity field and OmniSeek makes no such judgment. contexts is empty when S2 never parsed the citing PDF. For a young/hot field the best "graph" is often a human-curated survey/awesome-list, fetch that yourself instead. • FOUNDATIONAL vs FRONTIER: high in_degree = the foundational core; recent date (filter it yourself) + your relevance read = the frontier. There is no frontier flag — you judge it. • DATA HYGIENE: OpenAlex occasionally has a poisoned title (e.g. a 14k-citation paper titled "AI Consciousness" by T.B. Brown IS a corrupted GPT-3 record). You recognize these — no code does. Use a node's url to verify / omniseek_read to read the real paper. • Cluster + narrate relevance and sub-fields from titles + concept + your knowledge. • GAP DETECTION (your seed set's blind spots): each non-seed node carries seed_ref_freq (how many of YOUR seeds reference it = a foundational ref your reading list is MISSING) and seed_cite_freq (how many seeds it cites = a frontier citer you are MISSING). Sort non-seed nodes by these to find what your input lacks. edges (the in-corpus [citer, cited] citation DAG) lets you build the citation / co-citation / bibliographic-coupling maps yourself (co-authorship: use omniseek_coauthors). • BUDGET: there is an overall wall-clock cap (deadline_s, ~25s default). On a slow/throttling S2 the assemble bails early with a PARTIAL map (_meta.deadline_hit: true) rather than hanging — retry shortly, raise deadline_s, or use source=openalex.

Returns: {seeds, n_nodes, n_edges, edges:[[citer_id, cited_id]], nodes:[{id, title, year, date, cited_by, in_degree, concept, first_author, doi, url, is_seed, seed_ref_freq, seed_cite_freq}]} (sorted by in_degree as a default view only; seed_ref_freq/seed_cite_freq on non-seed nodes). _meta carries seed_titles + seed_note (auto-seed drift check), degraded, deadline_hit, partial.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNo
queryNo
seedsNo
sourceNoopenalex
n_seedsNo
max_nodesNo
deadline_sNo
citers_per_seedNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does so thoroughly. It discloses that there is no frontier flag, no polarity judgment, no S2 polarity field, that contexts may be empty, that results can be partial on deadline_hit, and that OpenAlex may contain poisoned titles — all beyond what structured annotations would supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded and well organized into scannable bullets, with the core purpose stated first. Some repetition exists around the no-judgment/cartographer framing, and a few tuning parameters could be explained in less prose, but most sentences carry real operational guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description enumerates the full return shape, explains edge cases (degraded, partial, deadline_hit), names source tradeoffs, flags data hygiene issues, and points to sibling tools for related needs. There is very little an agent would need to call this correctly that is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the 8 undocumented parameters. It adds strong meaning for query, seeds, source, and deadline_s, but leaves fresh, n_seeds, max_nodes, and citers_per_seed unexplained, so the agent must infer their purpose from defaults and names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: Map a research field's shape, and immediately defines the deliverable as the field's citation neighborhood. It also distinguishes this from judgment-heavy tools by calling itself a thin graph primitive with NO judgment, and it names a sibling alternative (omniseek_coauthors) for co-authorship.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states WHEN to use the tool (need citation neighborhood, foundational vs frontier), when to prefer seeds over query, and when to choose source='s2' over openalex. It even tells the agent to fetch a human-curated survey instead for young/hot fields, which is a clear alternative-routing instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_gatherA

Run N independent read-only eye tools IN PARALLEL, returning results in one response.

Fully-qualified MCP name: mcp__omniseek__omniseek_gather (server name is omniseek; there is no omniseek-eye server).

The agent decides WHAT to call (judgment). OmniSeek executes them (mechanical). Each call runs independently; one failure does not affect others. Calls that depend on a prior call's result belong in a SEPARATE gather (the agent reads this batch first, then decides the next batch).

calls: [{"tool": "omniseek_search", "args": {"query": "..."}}, ...] Bounded: max 10 calls. Read-only tools only. Calls naming search-index venues / nowcoder serialize through one paced backend (see server instructions (10)); >2 per gather adds a warnings entry.

wait_s: the patience budget. gather returns when all calls finish OR wait_s elapses, whichever comes first; calls still running are reported with status "warming" (their background threads keep going and warm the cache — pick them up later with staleness="cache_only" or a second gather).

Returns: {results: [{index, tool, status, result|error|hint}, ...], elapsed_s, completed, warming, failed, total} On an errored call whose failure is a call-signature mismatch (a wrong / missing argument), hint names the tool's REAL parameters (e.g. "omniseek_read takes: target, start_char, max_chars, ...").

ParametersJSON Schema
NameRequiredDescriptionDefault
callsYes
wait_sNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and delivers: independent execution, partial failure isolation, the wait_s timeout semantics, the "warming" status with background cache-warming behavior, and the hint mechanism for signature mismatches. It even discloses the serialization behavior for certain venues.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence front-loads the purpose, and the dense follow-up sections (fully-qualified name, calls format, wait_s, return envelope) all earn their place given zero schema coverage and no output schema. Minor redundancy — "read-only" appears twice — and the fully-qualified-name preamble is slightly meta, so it doesn't quite earn a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (parallel execution, partial failures, timeout races, cache warming) and the absence of annotations, output schema, and parameter descriptions, this description is remarkably complete. It documents both parameters, the full return envelope ({results, elapsed_s, completed, warming, failed, total}), error-hint behavior, and safety constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate — and it does fully. The ``calls`` parameter is given an exact shape ([{"tool": "omniseek_search", "args": {"query": "..."}}, ...]) plus constraints (max 10, read-only only), and ``wait_s`` is defined as a patience budget with precise return semantics. This adds far more than the bare schema's "array of objects with additionalProperties."

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Run N independent read-only eye tools IN PARALLEL, returning results in one response" names a specific verb, resource, and execution mode. It distinguishes the tool from its single-purpose siblings (omniseek_search, omniseek_read, etc.) by positioning it as the parallel dispatcher rather than an individual eye tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when/when-not guidance: "Calls that depend on a prior call's result belong in a SEPARATE gather," "Read-only tools only," and the max-10 bound. It also clarifies the division of labor ("The agent decides WHAT to call... OmniSeek executes them") and warns about the paced-backend serialization quirk for >2 calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_graphA

Use WHEN you want HOW two entities connect, or what OmniSeek already knows AROUND a paper / author / entity; read-only, budgeted projections of its accumulated evidence graph with typed edges (ONE graph).

Fully-qualified MCP name: mcp__omniseek__omniseek_graph (server name is omniseek; there is no omniseek-eye server).

Everything OmniSeek perceives is a statement with provenance ("X relates to Y, per Z"); the evidence graph accumulates those typed edges in ONE store surfaced through N indexes. It stores FACTS + labeled CANDIDATES, never verdicts: mechanical world edges (tier M: cites, authored, coauthored, affiliated, published_in, about, observed, exact-id same_as) and alignment CANDIDATES (tier A: title-fingerprint / fuzzy-name same_as, name-match authored, string mentions, signal conflicts). Judgment (claims, gaps, identity rulings) is tier J and is STRUCTURALLY excluded from OmniSeek's store — the views project structure, YOU judge it.

ONE STABLE VERB: omniseek_graph(view, args). view names the projection; args is that view's OWN parameter dict (the views are an open family, their params disjoint per view, so the ABI is (view, args), not a flat union). THE SCHEMA IS FROZEN: future views and future per-view parameters change NOTHING in this signature; a no-view call returns the live view catalog (the surface is self-describing), and content is NEVER inlined (every view returns node ids + labels

  • edge tuples, so you zoom with the other eye tools).

• view="find", args={"label_query": ..., "kind"?: ...} -> the ENTRY POINT. A node id is minted by the backend that knows it, so a NAME ("Siva Reddy") is not a node until you resolve it: find does the mechanical token/substring match over node labels and returns candidate ids + kinds. Every other view takes an anchor id; find is how you get one. • view="stats", args={} -> counts by kind / type / tier. The cheap orientation call (also the cold-start check: see below). • view="neighborhood", args={"anchor": ..., "depth"?<=2, "types"?, "policy"?, "max_nodes"?} -> the bounded subgraph around a node. • view="between", args={"a": ..., "b": ..., "types"?, "policy"?, "max_nodes"?} -> bounded connection paths between two anchors, the "how do these relate" question. Bidirectional BFS, <=2 hops per side, up to 8 shortest paths; capped when more existed. No path -> paths:[]. • view="voices", args={"doc_ids": [...], "policy"?: ...} -> collapse a doc set to distinct upstream VOICES via same_as + authored; the independence counter (mirror collapse, shared-speaker docs merge, docs with zero evidence land in unresolved and are NEVER counted as a voice). Input capped at 64 doc ids by explicit error; non-doc: ids come back in skipped. • view="since", args={"anchor": ..., "date": ..., "types"?, "max_nodes"?} -> the accretion log: what accreted around an anchor after a date (YYYY-MM-DD or full ISO), STORED edges only, tier + method shown on every row, NO collapsing (accretion is a fact stream, not an identity question). Derived edges carry no timestamps and are structurally absent. The sensor consumer. • view="similar", args={"anchor": , "k"?: ...} -> vector-nearest doc CANDIDATES for an anchor doc, method align:embed, by RANK (k is a budget, never a score threshold). PROPOSALS only, never collapsed by any policy; verify, then ratify with omniseek_ruling. Coverage: any doc with an embedded title, ranked across the UNION of the indexed vec matrix AND the thin-title vec_thin matrix (P7), so a thin arXiv original and an indexed post rank in ONE space; candidates may be thin docs. A doc with no vector in either store (un-embedded yet) -> an error naming that. NON-GOAL: vec_thin does NOT feed search's recall arm (similar + future P5 consumers only). A no-view call (view="") returns the live view catalog: each view's params + one-line blurb, DERIVED from the registry, so new views appear here without a client restart. Identity rulings are WRITTEN via omniseek_ruling (this tool stays read-only, hence gather-safe).

policy (an arg on the collapsing views) = conservative | working | exploratory: NAMED METHOD-SETS for how far to trust identity (same_as) edges when collapsing, NOT numeric thresholds (a hand-picked constant is pseudo-precision; the METHOD is the honest epistemic unit, as recall fuses by rank only):

  • conservative: collapse on exact-id equality only (DOI / OpenAlex / ORCID / arXiv; default)

  • working: conservative + agent identity rulings from graph_rulings.json

  • exploratory: working + title-fingerprint / fuzzy-name alignment CANDIDATES Identity is an EVIDENCE-CARRYING EDGE, never a destructive merge: same_as edges carry tier + method, collapse is reversible, and a not_same_as ruling beats a same_as. OmniSeek never MAKES an identity ruling; it only applies the ones you already recorded.

COLD START (set the expectation or the first stats reads as failure): documents and same-work edges are LIVE FROM DAY ONE (derived over recall's docs — the wall is born pre-populated by construction). Document THIN rows (title + url only, from NON-indexed sources) now accumulate from EVERY search (stats.node_kinds.document_thin), so the perception history is complete, not just the ~40 enumerable sources. Entity kinds (work / person / institution / venue / topic) still fill in as the P2/P3 write taps ship and calls happen; emptiness of those kinds early is CORRECT, not broken.

BUDGETS (the no-silent-caps discipline): depth is clamped to <=2, max_nodes caps the node count, and any capped result stamps capped: true so a bounded view never reads as complete. Schema + the view registry live in omniseek.core.recall.graph.

FAIL-OPEN: a graph failure returns an error dict, never an exception — the graph is memory, it must NEVER break search or recall.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
viewNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden, and it thoroughly discloses behavior: read-only and gather-safe, budget clamping with capped:true, fail-open returning error dicts instead of exceptions, structural exclusion of tier J verdicts, non-destructive identity policy, input caps, and vector-missing errors. It also states that content is never inlined and that derived edges carry no timestamps. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the tool is a polymorphic eight-view API with no schema or annotations to lean on, so most sentences earn their place. It is front-loaded with the core query intent, uses clear bullets and capitalization for structure, and avoids filler. A few concepts are restated for emphasis, but the density is justified by the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, no annotations, and only a two-property input schema, the description is remarkably complete: it covers all current views, step-by-step usage for find-to-anchor flows, budget semantics, identity policy behavior, cold-start expectations, failure mode, and the frozen ABI. An agent has everything needed to invoke the tool correctly and interpret its constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully compensate for the bare view/args schema. It does: every view name is documented with its args, types, defaults, and semantic meaning, and the self-describing no-view catalog behavior is specified. The policy values are defined as named method-sets rather than numeric thresholds, and budget params are explained. This is exactly the compensation needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise usage statement: "Use WHEN you want HOW two entities connect, or what OmniSeek already knows AROUND a paper / author / entity." It names the tool's resource (accumulated evidence graph with typed edges), identifies it as read-only, and differentiates it from sibling tools like omniseek_ruling and the other eye tools. The one-stable-verb (view, args) design is clearly explained, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance for each view, names the entry point (view="find"), and states when alternatives apply: writes go to omniseek_ruling, zooming uses other eye tools, and similar does not feed search recall. It even warns about cold-start expectations so an agent does not misinterpret early stats. This is far beyond minimum viable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_institution_cohortA

Use WHEN you need the people-ROSTER of a lab / department / university (who actively publishes there, optionally scoped to a field) — the "who's at this lab" question, orthogonal to co-authorship ("same lab, never co-authored" is still a tie, and the people-roster of a target lab is exactly the SG/Canada cohort question).

Fully-qualified MCP name: mcp__omniseek__omniseek_institution_cohort (server name is omniseek; there is no omniseek-eye server).

Resolve the institution (+ optional FIELD) -> roster ranked by their output AT that institution IN that field (so juniors with a few papers surface, not just senior profs). IMPORTANT: without concept you get the institution's most-prolific people across ALL fields (e.g. "Hong Kong University of Science and Technology" -> chemistry/materials profs, not the ML group) — pass concept="machine learning" / "natural language processing" / etc. to scope to a cohort. year_from (e.g. 2022) biases toward the CURRENT cohort (recent publishers). The roster is a STARTING POINT you drill (omniseek_coauthors / omniseek_read on homepages), not a verified lab-member list — OpenAlex has no "PhD student" flag.

Returns: {institution:{id,name}, filters, n, people:[{id, name, works_at_institution_in_field}], note}.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
conceptNo
year_fromNo
institutionYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it delivers: it explains ranking by output at the institution in the field, the all-fields default behavior, year_from recency bias, and the lack of PhD-student verification due to OpenAlex limitations. It also discloses the exact return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense, with the primary use case front-loaded before important caveats and return details. The fully-qualified MCP name warning is useful invocation context, and no sentence is purely filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero schema parameter descriptions and no output schema, this description is unusually complete: it covers what the tool does, when to use it, how parameters change behavior, what the result is, and its limitations. An agent has enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains institution, concept, and year_from with concrete examples and consequences, though limit is left to inference from its schema default. This is a strong recovery from an otherwise bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific purpose: retrieving the people-roster of a lab, department, or university, optionally scoped to a field. It explicitly frames this as the "who's at this lab" question and distinguishes it from co-authorship, making the tool's identity unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance, explains the field-scoping caveat, and names downstream tools (omniseek_coauthors / omniseek_read) for drilling into the roster. It also warns that the roster is a starting point, not a verified membership list, which sets correct expectations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_paper_enrichA

Use WHEN you need ONE paper's open-access full-text PDF, retraction / integrity status, or citation count — signals omniseek_search / field_skeleton do NOT give cleanly. Keyless, mechanical: YOU decide when + on which papers.

Fully-qualified MCP name: mcp__omniseek__omniseek_paper_enrich (server name is omniseek; there is no omniseek-eye server).

Pass DOIs and/or arXiv ids (e.g. "2306.08543", "10.1145/3292500.3330701"; use a node's doi from omniseek_field_skeleton, or metadata.paper_id/metadata.doi from an openalex omniseek_search result — NOT its source_id, the OpenAlex W-id, which is not a DOI/arXiv id). Enrich only the handful you care about, not a whole map. For each id: • is_oa / pdf_url — the open-access full text (arXiv always OA; real DOIs via Unpaywall). Feed pdf_url to omniseek_read (or read it yourself) to get the WHOLE paper, not just the abstract — then YOU synthesize. (This thin PDF primitive is why we did NOT add a synthesis engine.) For FIGURES / architecture diagrams / result plots: download the PDF and Read its pages with your own VISION — they render in context with captions, so no figure-extraction channel is needed. • integrity.retracted + integrity.notices (retraction / expression_of_concern / correction / …) from Crossref's Retraction Watch feed — check before trusting a high-stakes citation. (retracted=None means "not checked" / backend unreachable; notices=[] means clean. arXiv ids are checked too: an author withdrawal marker plus the journal DOI, when present, run through the same Crossref retraction path.) • citation_count — this paper's citation count (DOI: Crossref is-referenced-by-count; arXiv: S2 citationCount). The single-paper count's home, so you need NOT repurpose omniseek_field_skeleton to read one node's count. (None when the backend was unreachable.)

Returns: {"results": [{id, kind, doi, is_oa, pdf_url, oa_url, citation_count, integrity:{retracted, notices}}, ...]} (or {id, error} for an unrecognized id).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses key behaviors: keyless mechanical operation, no synthesis engine, OA semantics per ID type, retracted=None meaning 'not checked' versus notices=[] meaning clean, citation count sources, backend-unreachable behavior, and a clear result/error return shape. This is highly transparent beyond what structured fields provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely informative, front-loaded with the core purpose and organized with labeled bullets for each returned signal. Every sentence carries operational or decision-making value, and the return format is clearly laid out.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description defines the exact result structure, error cases, edge-case semantics for retraction status, and downstream usage. For a single-parameter enrichment tool with no annotations, this is complete enough for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is only one parameter, but the description thoroughly defines it: pass DOIs and/or arXiv ids, gives concrete examples, maps ID sources to specific fields in sibling tool outputs, and explicitly warns against using an OpenAlex W-id. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific use case: retrieving ONE paper's open-access full-text PDF, retraction/integrity status, or citation count. It explicitly contrasts these signals with those provided by omniseek_search and field_skeleton, making the tool's scope and distinction from siblings clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance ('Use WHEN you need ONE paper's...'), warns against enriching a whole map, and explains which IDs to pass versus which to avoid (not source_id/W-id). It also names sibling signals that do not cleanly provide this data and tells the agent to feed pdf_url to omniseek_read.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_paper_recommendA

Use WHEN you have a paper and want more like it — semantically-similar papers (SPECTER embeddings) that keyword search and the citation graph miss, including very recent work. Uses Semantic Scholar's recommendation model (SPECTER embeddings + co-citation), so it surfaces conceptually-related work that omniseek_search (keyword) and omniseek_field_skeleton (citations) miss — including very recent papers the citation graph has not caught up to.

Fully-qualified MCP name: mcp__omniseek__omniseek_paper_recommend (server name is omniseek; there is no omniseek-eye server).

Pass seed paper ids (arXiv ids / DOIs / S2 ids — a paper you found via omniseek_search or omniseek_field_skeleton). One seed = "more like this"; several = recommendations from that set. This is OmniSeek's "semantic search": it routes to S2's existing embeddings rather than building any. For an openalex omniseek_search result pass metadata.paper_id (or metadata.doi), NOT source_id — the OpenAlex W-id is a graph id the paper tools do not accept.

Returns: {"seeds", "n", "papers": [{id, title, year, date, cited_by, first_author, doi, url}]} (ordered by S2 relevance; YOU re-judge). Citation neighborhood instead → omniseek_field_skeleton; keyword search → omniseek_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
limitNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It explains the underlying mechanism (SPECTER embeddings + co-citation), notes that results are ordered by relevance and that the agent should re-judge, and clarifies it uses existing S2 embeddings. It doesn't explicitly state non-destructive behavior or rate limits, but these are reasonably implied for a recommendation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence adds distinct value: purpose, mechanism, input details, output format, alternatives, and even server naming. Information is front-loaded, starting with the core use case, and the flow is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description fully specifies the return structure and ordering. It also covers alternative tools, input constraints, and the MCP server context, leaving nothing an agent needs to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only names and types (0% coverage). The description compensates richly: it specifies acceptable id formats (arXiv, DOI, S2 ids), explains how to pass multiple seeds, and warns against using OpenAlex source_id, which is a common mistake. The limit parameter is not elaborated but its default and obvious purpose make that a minor omission.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific use case ('Use WHEN you have a paper and want more like it') and explicitly contrasts with sibling tools (keyword search and citation graph), making the tool's purpose unambiguous and distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use criteria, what inputs to pass (seed paper ids), a critical pitfall for OpenAlex IDs (metadata.paper_id vs source_id), and names alternatives (omniseek_search, omniseek_field_skeleton) with the conditions that select them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_readA

Read text from any URL OR document FILE — OmniSeek's single "read this deep" verb. AUTO-ROUTES.

Fully-qualified MCP name: mcp__omniseek__omniseek_read (server name is omniseek; there is no omniseek-eye server).

ROUTING: if target is a local filesystem path OR ends with a document extension (.pdf / .pptx / .docx / .xlsx / .txt / .md / .csv, case-insensitive, a ?query is tolerated) it routes to the DOCUMENT reader (below); otherwise it routes to the URL reader. A LOCAL path ending in .html / .htm also routes to the document reader, which returns the page's extracted text; an http(s) .html URL stays on the URL branch, where the adapters live. start_char / max_chars window the body on BOTH branches (see below); export_media / ocr apply only to the document branch (a URL read has no image-extraction path) and are IGNORED on the URL branch.

URL BRANCH: fetch + normalize ONE URL. Tries each registered adapter until one claims it — a specific article link (a Reddit post, an arXiv paper, a Bluesky post) as a normalized document. arXiv is two-tier by design: an /abs/<id> URL returns abstract-level metadata (title / authors / abstract, a fast lookup), while an /pdf/<id> URL routes to the PDF extractor and returns the WHOLE body (e.g. 2203.02155v1 → 68 pages of full text). Pass the URL whose depth you want. vs the open web: reads ONE specific URL you already have; to FIND open-web pages use WebSearch first, then omniseek_read to normalize the page (a common pairing). The normalized body is WINDOWED by start_char / max_chars (default 24000), exactly like the document branch: a big page (a SEC 10-K/20-F is ~2 MB → ~200k chars, a long article) would otherwise return one blob that overflows the tool channel and is unreadable. When truncated is true, re-call with start_char bumped by returned_chars to page through the rest. A small page (< max_chars) returns whole, truncated=false — unchanged from before. URL branch returns: {"url", "matched": bool, "document": Document as dict | None, "total_chars", "returned_chars", "start_char", "truncated"} (the last four only when matched). On matched:false a reason is added: walled (anti-bot challenge -> retry the source via CDP, e.g. omniseek_search(sources=[...], raw=True, full=True)) vs empty vs blocked, so you can tell "gated, drill it another way" from "genuinely nothing there".

DOCUMENT BRANCH (pptx / docx / xlsx / pdf / txt / md / csv): read the FILE into readable, structured text — the document counterpart of omniseek_transcribe (speech). Free, keyless, cached. WHERE THE FILE LIVES:

  • the operator's machine: scp it to OmniSeek host inbox first — scp "" :omniseek-inbox/ then call with "omniseek-inbox/".

  • Anywhere on the web: just pass the URL (conference slide decks, a shared docx, a PDF). WHAT COMES BACK: outline = per slide/sheet/page {label, chars, media} — the MAP of the whole document, always complete and tiny; text = the readable content ("## Slide 3" / "## Sheet: budget" / "## Page 5" headers), windowed by start_char/max_chars for big docs (truncated=true + total_chars tell you to re-call with start_char to continue); media/media_total = the image inventory per section. THE IMAGE HALF (be honest about it): a figure deck or scanned doc carries its meaning in IMAGES — text extraction alone is NOT the document. Two ways to read it: omniseek_view delivers the figures to your OWN vision in-band (judging the figure is yours); ocr=True here runs OCR over every embedded image and folds the recognized text-in-pixels (scanned page body, chart labels, palette HEX/RGB codes) into the body under a '图中文字 (OCR)' section — mechanical text transcription, NOT figure interpretation, and labeled as possibly imperfect. Use ocr for text-bearing images (scans, labels); use omniseek_view to SEE the figure. Document branch returns: {source, format, title, outline, text, total_chars, returned_chars, start_char, truncated, media_total, media, media_dir, ocr_images?, cached} — or {source, error, inbox_files?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
ocrNo
targetYes
max_charsNo
start_charNo
export_mediaNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure—and it delivers. It reveals the auto-routing logic, the arXiv two-tier behavior, the windowing/truncation mechanism, the error categories (walled vs empty vs blocked), and the image/OCR handling. It even discloses that OCR is mechanical and possibly imperfect. No contradictions with annotations (none present).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence earns its place given the tool's complexity. It is front-loaded with the core purpose and routing, then organized with clear headers (URL BRANCH, DOCUMENT BRANCH, IMAGE HALF) and bullet-style breakdowns. No redundancy or filler; the density is justified by the need to convey nuanced behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex tool with no output schema, so the description must fully specify return values—and it does. For the URL branch it lists the exact fields returned, including the added 'reason' on matched:false. For the document branch it details outline, text, media, and caching. It also covers the file-transfer mechanism (scp) and the two ways to handle images. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description is the sole source of parameter meaning. It explains target (URL or path), start_char and max_chars (windowing and paging), export_media (document branch only), and ocr (image text extraction). It also clarifies their scoped behavior on each branch. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific verb+resource: 'Read text from any URL OR document FILE' and immediately distinguishes itself from siblings (omniseek_search, omniseek_transcribe, omniseek_view). The auto-routing between URL and document branches is explicitly defined, so an agent knows exactly what this tool does and how it differs from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit routing rules (file extension vs. URL), tells when to use WebSearch first, when to use omniseek_view for figures, and how to page through truncated results. It also explains when parameters like export_media and ocr are ignored. This is a textbook example of usage guidance with clear alternatives and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_resolve_identityA

Resolve a PERSON's name to candidate author ids — the shared front door for EVERY relationship layer (you must know WHICH person before you can map their connections).

Fully-qualified MCP name: mcp__omniseek__omniseek_resolve_identity (server name is omniseek; there is no omniseek-eye server).

OmniSeek's other tools keyword-search PAPERS; this resolves an AUTHOR. It NEVER silently picks — it returns ranked CANDIDATES so YOU disambiguate (the homonym trap: "Zhennan Shen" is three different people in OpenAlex). hint (e.g. an institution like "HKUST", or a field) only RE-ORDERS candidates, never filters them. source: "auto" (OpenAlex first, pulls in Semantic Scholar when the top OpenAlex hit is sparse — i.e. a likely junior / arXiv-frontier author OpenAlex hasn't indexed), "openalex", or "s2".

paper (an arXiv id / DOI / title of a KNOWN paper by this person) is the reliable way to pin a COMMON-NAME JUNIOR — it resolves straight from the paper's author list, where a bare name search fails (e.g. many distinct researchers share a common name like "Wei Zhang"; their paper fixes the exact id).

Use the returned id with omniseek_coauthors. ambiguous: true means two comparable candidates — confirm with a hint / a paper / a known co-author before trusting either.

likely_same_person (when present) groups same-name same-backend candidates that are likely ONE person SPLIT across ids, with a ready-to-paste merge_token ("A123+A456") you can hand straight to omniseek_coauthors as one input; it never auto-merges, just surfaces the candidate merge.

Returns: {query, source, candidates:[{id, source, name, works_count, cited_by, institution, via_paper?}], ambiguous, note, likely_same_person?:[{source, ids, name, merge_token, note}], degraded?:{openalex}}. degraded (when present) means the OpenAlex lookup FAILED (rate-limited / upstream down): an empty/thin result is then missing-data, NOT a confirmed "not in the graph" — retry, or pass source='s2' / paper=.

ParametersJSON Schema
NameRequiredDescriptionDefault
hintNo
nameYes
paperNo
sourceNoauto

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral transparency burden. It discloses that the tool never silently picks, that hint only re-orders and never filters, that likely_same_person never auto-merges, and that degraded means missing-data rather than a confirmed absence. This is far more than a typical tool description provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but deliberately information-dense; every paragraph adds actionable guidance rather than filler. It is front-loaded with the core purpose and distinct identity, then layers details about parameters, disambiguation, merge tokens, and degraded behavior in a logical order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and no annotations, the description is exceptionally complete. It documents the full return shape, explains ambiguous and degraded response fields, provides retry strategies, and ties the output into the broader coauthors workflow. An agent has everything needed to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does. Every parameter is explained with meaningful semantics: hint's re-order-only behavior, source's three modes and 'auto' logic, paper's role in resolving common-name authors, and name as the required person to resolve.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Resolve') and resource ('a PERSON's name to candidate author ids'), and immediately distinguishes itself from sibling tools: 'OmniSeek's other tools keyword-search PAPERS; this resolves an AUTHOR.' It also frames the tool as the 'shared front door for EVERY relationship layer,' making its role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly says when to use this tool versus alternatives: paper search is for papers, this is for authors, and the result should feed omniseek_coauthors. It also gives concrete conditional guidance: use hint to re-order, use paper to pin common-name juniors, verify ambiguous candidates, and pass source='s2' or paper= when degraded.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_rulingA

Use WHEN two graph nodes ARE (or are NOT) the same person / entity and you want views to collapse them — record / list / retract same_as | not_same_as rulings (the one judgment channel the graph's working policy applies).

Fully-qualified MCP name: mcp__omniseek__omniseek_ruling (server name is omniseek; there is no omniseek-eye server).

OmniSeek never MAKES a ruling; it STORES yours as declarative state and APPLIES it at read time (the sensors.json precedent: judgment persisted as config OmniSeek executes mechanically). A ruling says "these two graph nodes ARE / are NOT the same entity"; omniseek_graph's working and exploratory policies then collapse (or reject) that pair when projecting a view. The pair is the KEY: it normalizes to src < dst, re-creating a pair REPLACES the prior verdict (declarative state, not a log; git history is the audit trail).

action picks what to do: • action="create" (src, dst, verdict="same"|"not_same"; optional note) -> record the ruling. Returns {created: true, ruling, replaced} (replaced=true if it overwrote a prior verdict for the pair). A bad verdict / empty or identical endpoints -> {"error": ...}. • action="list" -> {rulings: [{src, dst, verdict, note, ruled_at}], count}. • action="delete" (src, dst) -> {deleted: true/false} (false if no ruling existed for the pair).

This is a SEPARATE tool from omniseek_graph (not an omniseek_graph action) because omniseek_graph is batchable in omniseek_gather ONLY because it is read-only; folding a write into it would let the gather whitelist write. Unknown action -> {"error": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
dstNo
srcNo
noteNo
actionYes
verdictNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavioral burden and does so impressively. It discloses that OmniSeek never makes rulings but stores them declaratively, that pairs normalize to src < dst, that re-creating a pair replaces the prior verdict, and that git history is the audit trail. It also details per-action behavior and error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with the use case and core semantics. The fully-qualified MCP name paragraph and the extended separation rationale add useful context but go slightly beyond what is strictly necessary, keeping this from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter tool with no output schema and no annotations, the description is complete. It covers all actions, return shapes, replacement semantics, error cases, and the relationship to graph policies, so an agent can invoke the tool correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does. It defines the action values ('create', 'list', 'delete'), verdict values ('same' | 'not_same'), the required operands for each action, the optional note, pair normalization, and error conditions like bad verdicts or empty/identical endpoints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific trigger ('Use WHEN two graph nodes ARE (or are NOT) the same person/entity...') and a specific operation ('record / list / retract same_as | not_same rulings'). It clearly names the resource (rulings) and explicitly separates itself from omniseek_graph, so an agent can distinguish it from siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-to-use condition and explains why this write operation is deliberately not part of omniseek_graph, which is strong routing guidance. It does not explicitly compare against sibling tools like omniseek_resolve_identity, so not a perfect 5, but the trigger and separation rationale are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_sensorA

Use WHEN you want to MONITOR a query over time and be told only what's NEW — standing queries with novelty detection. ONE verb; action picks what to do.

Fully-qualified MCP name: mcp__omniseek__omniseek_sensor (server name is omniseek; there is no omniseek-eye server).

The agent decides WHAT to monitor (judgment); the sensor diffs mechanically (a (source, source_id) fingerprint diff against baseline). Each action's REQUIRED args:

• action="create" (query; optional sources, schedule, notify) -> register a standing query that detects NEW results over time. Sensors run on their schedule automatically in the live service (hourly | daily | weekly; unknown = daily); use action="run" to trigger one manually. Returns the created sensor with its id. notify=True means the scheduler alerts when a scheduled run finds new results; optional notify_if=[keywords] narrows that alert to ONLY new results whose title/content match (notify_if_match="any" default, or "all"), so a broad standing query alerts on the sliver you care about instead of every new item. Optional detect_absence=True ALSO alerts when a tracked STABLE-source item DISAPPEARS (e.g. a page_watch policy page that goes dark / 404s); scoped to stable sources so a churny query sensor is unaffected. • action="list" -> all registered sensors with last-run stats {id, query, sources, schedule, last_run_at, last_new_count, total_runs, baseline_size}. • action="delete" (sensor_id) -> delete a sensor by id. Returns {deleted: true/false}. • action="run" (sensor_id) -> manually trigger one sensor NOW (the manual path beside the automatic scheduler): runs its query, diffs against baseline, updates state, returns a summary with new_count + new_titles. Tests a sensor on demand without waiting for its schedule.

Unknown action, or a missing required arg, returns {"error": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
actionYes
notifyNo
sourcesNo
scheduleNodaily
notify_ifNo
sensor_idNo
detect_absenceNo
notify_if_matchNoany

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and handles it well. It discloses that the sensor diffs mechanically via a (source, source_id) fingerprint against baseline, that scheduled runs happen automatically in the live service, that unknown actions or missing required args return an error, and that detect_absence only applies to stable sources. These details go well beyond the bare schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with action-specific bullets and front-loaded usage guidance. Nearly every sentence adds operational value. There is minor redundancy — 'standing queries with novelty detection' and 'register a standing query that detects NEW results over time' restate the same idea — and the 'no omniseek-eye server' note is tangential, but the organization makes the density acceptable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter multi-action tool with no annotations and no output schema, the description is remarkably complete. It covers required arguments per action, defaults, scheduling behavior, return summaries, error handling, and edge cases like absence detection scoping. An agent has enough information to select actions, supply parameters, and anticipate results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for every parameter. It does: action is enumerated with all four values, query is identified as required for create, sources/schedule/notify are explained, notify_if and notify_if_match semantics are detailed, sensor_id is tied to delete/run, and detect_absence is fully described. All 9 parameters receive meaningful explanation beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific purpose: 'MONITOR a query over time and be told only what's NEW — standing queries with novelty detection.' It clearly identifies the tool as a standing-query sensor rather than a one-shot search, distinguishing it from siblings like omniseek_search and omniseek_sources. The action-based breakdown (create/list/delete/run) further clarifies exactly what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: when monitoring a query over time and wanting novelty detection. It also gives action-level guidance, such as using action='run' to trigger a sensor manually and action='create' to register one. It does not explicitly name alternative sibling tools or state when not to use it, but the use-case framing is strong enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_sourcesA

List all sources — call this to ROUTE before searching.

Fully-qualified MCP name: mcp__omniseek__omniseek_sources (server name is omniseek; there is no omniseek-eye server).

BOUNDED ORIENT: a bare (no-arg) call does NOT dump every source's facets. It returns the routing VOCABULARY (available_domains / available_regions with counts) + the capabilities verb index + source_names (the bare inventory) + counts, so the orient payload stays small no matter how far the roster grows (brain_orient's lesson). The per-source FACETS (kind / domains / regions / modes, needs_credentials, explicit_only, stability, health, ...) plus the prose description arrive when you NARROW or ask verbose — reach for them on demand: • domain="jobs" / "papers" / … → only sources whose domains facet contains it, WITH their full descriptions. domain= is the most RELIABLE router; the no-arg call returns available_domains (the full closed vocabulary + counts) so you can pick a valid token, and a near-miss (e.g. "careers") returns did_you_mean instead of a silent empty. • query="singapore visa" → TOKEN-OVERLAP over name + description + domains + regions + cross-lingual keywords, ranked best-first (multi-word- and English↔中文-safe), WITH descriptions. • region="sg" / "ca" / "cn" → only sources whose regions facet contains it (the no-arg call returns available_regions; a near-miss returns did_you_mean). Region narrowing matters when the deployment's source pack is geographic. • verbose=True → the full unfiltered list, WITH every description. check_health=True does a fresh LIVE probe of every source (slow) AND returns a system block: the recall-index health (indexed_docs / embedder_available / vec_embed_failures / last_write_age_s) plus the observation-journal durability head, materialization cursor, pending count, and failures. and the openalex_usage attribution (which component spent the shared daily budget + remaining).

The no-arg (orient) call also returns capabilities: the non-search VERB index (field_skeleton, coauthors, transcribe, …) so you discover the whole toolkit here, not only after loading a tool.

kind per source: lookup (query = search the venue) | stream (query = FILTER over a recent feed; nowcoder additionally adds a site search) | proxy (search-index venue: engine snippet, shared paced backend) | portal (single-URL fetch). explicit_only_reason says WHY a source stays out of the broad sweep; a reason containing "shared paced backend" means the source draws on the one web-search backend of section (10) in the server instructions.

Returns: {"count": N, "backend_count": M, "backend_breakdown": {...}, and EITHER

  • a BARE ORIENT: "source_names": [...] + "note" + available_domains + available_regions + capabilities; OR

  • a NARROWED (domain/region/query) or verbose call: "sources": [{name, backend, (description when narrowed/verbose), needs_credentials, explicit_only, explicit_only_reason? (present only when excluded; the full catalog of why-strings search's _meta.excluded_count no longer re-ships), param_hint? (the structured query a VERTICAL source wants — a stock code / ticker / author name — present only when the source declares one, so a named call is filled right the first try), stability, access_tier, health, health_as_of, kind?, domains?, regions?, modes?, (healthy, status if check_health)}]. (did_you_mean on a domain/region near-miss; system:{recall, openalex_usage, jobs:[{name, schedule, enabled, last_run, next_run, budget_s, desc}, ...]} when check_health — the background-job fleet.)}

count is the RAW source count; it over-states coverage when many logical sources sit on ONE upstream. backend_count is the distinct UPSTREAMS (the honest figure) and backend_breakdown names every upstream backing >1 source, e.g. {"openalex": 42} (40+ affiliation slices of one corpus + one API budget + one breaker = one backend, not 40 of coverage).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
domainNo
regionNo
verboseNo
check_healthNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, and it excels. It explains that a bare call returns a bounded orient (not all facets), that narrowed calls include descriptions, that check_health performs a slow live probe, and it details the distinction between count and backend_count. It also explains the meaning of kind and explicit_only_reason. All behaviors are explicitly documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with bullet points and clear sections (BOUNDED ORIENT, per-source facets, Returns, etc.). It is front-loaded with the primary purpose. However, it is verbose, containing extensive detail that could be trimmed for conciseness. Still, each section serves a purpose, and the structure helps an agent parse it. It earns a 4 rather than 5 due to length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 parameters, no output schema, no annotations), the description is remarkably complete. It covers all routing scenarios, return structures, and caveats (e.g., count overstates coverage). Nothing an agent needs to correctly call and interpret results is missing. It even explains the 'kind' per source and the param_hint mechanism.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero descriptions for parameters, so the description must compensate. It does so thoroughly: query= is described as token-overlap over multiple fields, domain= as a facet match with did_you_mean on near-miss, region= similarly, verbose=True as full unfiltered list, and check_health=True as a live probe plus system block. Each parameter's effect and return implications are explained in detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List all sources — call this to ROUTE before searching,' clearly stating the tool's purpose as a source router. It distinguishes itself from sibling search tools by positioning it as the pre-search routing step. The phrase 'call this to ROUTE' and the mention of returning available_domains/regions for token selection make the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs when to use the tool ('call this to ROUTE before searching') and details each parameter's effect: domain= for facet-based routing, query= for token-overlap search, region= for geographic narrowing, verbose=True for full list, and check_health=True for live probing. It also notes when to use the no-arg call versus narrowed calls, providing clear usage guidance and routing logic.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_statementA

Use WHEN you've concluded a DIRECTED, decision-relevant relation OmniSeek does NOT already store mechanically (X acquired_by Y, paper P refutes claim Q, path R requires gate S) and want the graph to carry it forward — record / list / retract typed relation statements (the general sibling of omniseek_ruling; identity types belong to omniseek_ruling).

Fully-qualified MCP name: mcp__omniseek__omniseek_statement (server name is omniseek; there is no omniseek-eye server).

OmniSeek never MAKES a statement; it STORES yours as declarative state and PROJECTS it at read time (the rulings / sensors.json precedent: judgment persisted as config OmniSeek applies mechanically). A statement is a DIRECTED, typed relation between two graph node ids: "openai --acquired_by--> someone", "paper X --refutes--> claim Y". It surfaces in omniseek_graph's neighborhood / between / since under working / exploratory (never conservative — the pure mechanical world) AND, since the write-side read-back, AMBIENT on any future omniseek_search hit of an endpoint (the metadata.graph.judgments stamp): recording is NOT write-only — your judgment returns to you when you next touch the node. The directed triple (src, dst, type) is the KEY, so re-creating it REPLACES the prior note; direction is YOUR assertion, never normalized.

WHAT EARNS A STATEMENT (the value gate — all three must hold, else it is noise that BURIES the edges carrying a real decision; the graph's value is inverse to its noise density):

  1. NON-MECHANICAL — a relation OmniSeek does NOT already store as a fact. cites / authored / affiliated / coauthored / published_in / about and bare bibliometric counts are the mechanical M/A world; re-asserting them here pollutes the judgment channel, which is for what an API cannot read off: YOUR read.

  2. DECISION-RELEVANT — resurfacing it would change a future call (a positioning, a gate, a disqualifier, a fit verdict, a trajectory read). A true-but-inert edge (both-about-RAG, everyone-at-lab-X-affiliated-with-X) is noise.

  3. AS-OF-STAMPED IF A SNAPSHOT — a point-in-time relation (leads / rising / froze_hiring) drifts while its endpoints stay; put the as-of date in the note, or route it to a sensor, so a future reader never mistakes a stale snapshot for the present.

type is FREE agent vocabulary (mechanically slugged: lowercase, spaces -> underscores, [a-z0-9_] only, <= 40 chars; views never branch on it). An OPEN family, NOT a menu — coin your own; some exemplars across domains: • positioning: attacks_premise_of / near_miss_of / validates_premise_of / does_not_flatten / anchors / introduces (map a competitive / thesis landscape around a claim node). • provenance / motive: sourced_from_motivated_party / covers (a source's motive; a walled or cross-lingual source covering what another missed). • DECISION-space (the non-academic half, easiest to forget): requires / blocked_by / gated_on (a blocking precondition), disqualified_by / ruled_out_because (an option-eliminator), good_fit_for / misaligned_with / froze_hiring / rising (fit + trajectory), reached ... via (a PATH-SAMPLE: how someone actually reached an outcome). Two types are REFUSED with a pointer to omniseek_ruling: same_as / not_same_as — identity is a pair-keyed, symmetric judgment the collapse machinery consumes, kept to omniseek_ruling's one channel.

MEMORY-vs-GRAPH boundary: prose understanding (a lesson, a conclusion, context, confidence, scope) is the ATOM — it lives in YOUR own notes / memory, or in this statement's note. The graph statement is a POINTER, minted only when there is a specific PAIR of wall-addressable nodes whose FUTURE retrieval must carry the judgment; its note / doc point BACK at the prose rather than restating it. Default to prose; the edge is an opt-in index. (Everything is both a thought and an edge; the test is whether two NAMED nodes must carry it forward.)

Endpoints may be ANY node id, even ones no tap minted (claim:..., org:..., inst:label:openai): a statement may pre-date the wall. Such HAND-MINTED ids FRAGMENT across sessions (claim:c3_wedge vs claim:c3_exact_wedge silently orphans the edge), so REUSE an existing id: a create echoes similar_anchors (existing near-match hand-minted ids) so you reuse one instead of minting a near-duplicate; keep a stable slug for your durable anchors.

action picks what to do: • action="create" (src, dst, type, note; optional doc) -> record. note is the REQUIRED reasoning; doc the optional provenance node id (a doc:{source}:{sid} or a note id, strongly encouraged). Returns {created, statement, replaced, similar_anchors?}. A bad type / empty endpoint / empty note / a refused identity type -> {"error": ...}. • action="list" (optional about=node id, optional type) -> {statements, count}, filtered to statements touching about and/or of type. Capped at 200 with a capped flag. • action="delete" (src, dst, type) -> {deleted: true/false}.

Like omniseek_ruling this is a SEPARATE tool from omniseek_graph (omniseek_graph stays read-only, hence batchable in omniseek_gather). Unknown action -> {"error": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
docNo
dstNo
srcNo
noteNo
typeNo
aboutNo
actionYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly: it discloses replace-on-recreate semantics, non-normalization of direction, ambient projection on search, hand-minted id fragmentation, similar_anchors echo, per-action returns, list cap of 200, and error behavior for bad actions or types. This is far beyond typical disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the tool is genuinely complex and the length is justified by actionable detail. It is well organized with clear section headings and front-loaded intent; minor redundancy around omniseek_ruling and graph separation keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and minimal input schema descriptions, the description supplies everything needed to invoke all three actions correctly: endpoint flexibility, type constraints, refused types, memory-vs-graph boundary, action-specific parameters, return shapes, and failure modes. An agent can call this tool without further clarification.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description defines what each action needs: create requires src, dst, type, note with optional doc; list takes optional about and type; delete takes src, dst, type. It also explains the meaning of note, doc, type, and about with concrete examples and constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb-resource pair: 'record / list / retract typed relation statements' for directed, decision-relevant relations. It also distinguishes itself from omniseek_ruling and omniseek_graph, giving an agent a clear identity for this tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use guidance via the three-part value gate (non-mechanical, decision-relevant, as-of-stamped) and names alternatives: omniseek_ruling for identity types, prose/memory as default, and omniseek_graph for read-only graph access. This removes ambiguity for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_transcribeA

Transcribe the SPOKEN content of a video / podcast / audio URL via local SenseVoice ASR (free, keyless, private, cached forever; chosen over Whisper after a real-audio benchmark — Whisper hallucinates on Chinese podcast intros). For the 干货-in-audio case where the substance is in the audio, not any text: bilibili videos (论文精读 / 方法论 / 读博 / 求职 talks), 小宇宙 podcasts, or any direct audio-file URL. (youtube already returns its captions via omniseek_read — no ASR needed; use that instead.)

Fully-qualified MCP name: mcp__omniseek__omniseek_transcribe (server name is omniseek; there is no omniseek-eye server).

THE LONG-EPISODE PATTERN: do NOT transcribe a 2-3h episode whole (30k+ chars nobody reads). Pull the chapter timestamps from the episode's shownotes (小宇宙 episode pages list them; use omniseek_search(query, sources=["xiaoyuzhou"], raw=True, full=True) / omniseek_read first), judge WHICH chapter matters, then transcribe just that slice: start="1:02:30", duration="12:00". Accepts seconds ("3750") or MM:SS / HH:MM:SS. Slices are also fast to start — on direct/enclosure audio only the slice region is downloaded. The flat transcript covers [start, start+duration] of the source audio. Pass segments=True to ALSO get a per-VAD-segment segments: [{start,end,text}] list (seconds) so a no-shownote episode becomes navigable / time-citable (the flat transcript is unchanged; segments costs an extra VAD + a batched re-transcribe pass, so request it only when you need the offsets).

Whole-item transcription remains right for short/dense items (a 10-min talk, a keynote clip); it is SLOW on first call for a long item, then cached forever. Reach for it deliberately on ONE item you've judged worth it, never as part of a broad sweep.

language: "" auto-detects; set "zh" / "en" to skip detection and sharpen accuracy when you already know the language.

diarize=True answers WHO said what (interviews / 对谈 / multi-host podcasts): segments become [{start,end,text,speaker}] with per-turn speaker labels and speakers gives the distinct count. It routes through a Chinese-focused diarization pipeline (Paraformer-zh + cam++ speaker clustering), a SEPARATE and heavier pass than the flat SenseVoice path, so request it only when the speaker turns matter, and expect zh accuracy (English audio is not its target). Cannot combine with plain segments (diarize supersedes it). speaker values are cam++'s cluster indices (0,1,2,...).

speakers=N pins the diarization to N speakers (the KNOWN head-count: a 1-on-1 interview = 2, a solo talk = 1, a 3-host panel = 3). PASS IT whenever you know the count: cam++'s automatic estimate is unstable on short / noisy slices and will over- or under-split, so pinning N is what makes the turns track reality. Leave it 0 (auto) only when the count is genuinely unknown. Ignored unless diarize=True.

Returns: {url, transcript, chars, audio_seconds, asr_seconds, source, title, cached, start_seconds?, duration_seconds?, segments?, speakers?} — or {url, error, transcript:""} if no audio resolved.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
startNo
diarizeNo
durationNo
languageNo
segmentsNo
speakersNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it delivers: it discloses that the service is free/keyless/private/cached forever, that long-item first calls are SLOW, that slices download only the needed region, that diarize is a separate heavier pass, that segments and diarize are mutually exclusive, and that speaker values are cluster indices. These are exactly the non-obvious behavioral traits an agent needs to set expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is well-structured with thematic paragraphs, inline code formatting, and front-loaded purpose/alternative information. Each section earns its place by enabling correct invocation, though a few sentences (e.g., the Whisper benchmark rationale) are context rather than necessity. It is slightly verbose but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 7-parameter tool with no annotations and no output schema, the description is remarkably complete. It covers all parameters, provides the full return object shape including optional fields and error case, explains interacting flags, and addresses performance characteristics. An agent can invoke this tool correctly with no further information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does comprehensively. It explains the url, start/duration formats (seconds or MM:SS/HH:MM:SS), language auto-detection and the benefit of setting it, segments as an extra VAD pass, diarize as superseding segments, and speakers as a pinning mechanism ignored unless diarize=true. Every parameter is given semantic meaning beyond its name and type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Transcribe the SPOKEN content of a video / podcast / audio URL via local SenseVoice ASR'. It also differentiates from the sibling omniseek_read by explicitly stating that YouTube already returns captions via omniseek_read and ASR is not needed, so an agent can immediately tell which tool to use without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use the tool: bilibili videos, 小宇宙 podcasts, or direct audio-file URLs, and when not to: YouTube, which should use omniseek_read instead. It also provides a clear long-episode pattern (pull chapter timestamps, transcribe only a slice) and warns against whole-item transcription for long episodes. This is concrete, actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

omniseek_viewA

SEE with your own vision, IN-BAND — document figures, loose image URLs, or video frames. ONE verb; kind="auto" picks the branch (or force it with kind=document|images|video).

Fully-qualified MCP name: mcp__omniseek__omniseek_view (server name is omniseek; there is no omniseek-eye server).

ROUTING (kind="auto"): a document path/extension (.pdf/.pptx/.docx/.xlsx/…, as in omniseek_read) → DOCUMENT figures; a video URL (youtube/bilibili/douyin host or a .mp4/.webm/.mov suffix) → VIDEO frames; otherwise → loose IMAGE URLs (target may be a comma-separated URL list). The images come back as image content you can look at directly (no download/scp dance); OmniSeek only renders the pixels, what they MEAN is yours to read.

WHICH PARAMS BELONG TO WHICH KIND: • document: sections (comma-separated slide/page numbers to pull, "" = all), names (comma-separated exact image names from the omniseek_read outline media[].name), max_images (full-res cap; a wider selection falls back to a contact sheet). THE TWO-STEP: first omniseek_read to get the outline (which slides/pages hold images), then call this — with NO sections/names you get a CONTACT SHEET (every image a labeled thumbnail tiled into one montage; triage ~30 for the cost of one), then pull the few that matter full-res by sections="8,15" or names="s08_02_image.png". Covers pptx / pdf / docx (the image-bearing formats); text formats return a note. render_pages="8,15" is the COMPLEMENT (PDF): it renders those WHOLE pages to images, the channel for a page whose substance is VECTOR figures / dense tables / a layout carrying NO embedded raster (where sections/names find nothing). This is how you READ a visual page you cannot trust as parsed text: route to the doc, omniseek_read for the page you want, then render + see it with your own vision. • images: target = image URLs comma/space/newline separated (paste a walled post's media[] list — xiaohongshu / zhihu note images, where the 干货 often lives). max_images caps per call. • video: start / duration (optional slice: "8:30", "90", "1:02:30"; default the whole video, capped at 30 min), n (frames to sample, default 12, max 24). The VISUAL half of omniseek_transcribe: its on-screen slides / diagrams / code / charts as ONE labeled contact sheet (a timestamp under each frame). Pair with omniseek_transcribe on the same slice for BOTH halves. (bilibili frames ride the same activated playurl session as bilibili audio — the ASR path's visual sibling.)

Returns image content blocks: document = [contact-sheet montage + legend] or [manifest + one block per figure]; images = [manifest + one block per URL that loaded]; video = [contact-sheet + timestamp legend]. Or an error / honest "nothing to show" note.

ParametersJSON Schema
NameRequiredDescriptionDefault
nNo
kindNoauto
namesNo
startNo
targetYes
durationNo
sectionsNo
max_imagesNo
render_pagesNo
contact_sheetNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries behavioral disclosure. It explains it returns image content blocks, can produce contact sheets or manifests, falls back to honest 'nothing to show' notes, applies caps, and avoids any download/scp step. It even notes the bilibili session dependency for video frames.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the length is justified by the tool's polymorphic behavior and 10 parameters. It is well-organized with clear headings and per-kind parameter groupings, though some rhetorical flourishes and redundant emphasis could be trimmed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complex branching behavior, 10 parameters, and no output schema, the description is remarkably complete. It covers routing, per-kind parameters, return formats, limits, fallback behavior, the required omniseek_read prerequisite, and relationships to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description compensates strongly by explaining target, kind, sections, names, max_images, render_pages, start, duration, and n with concrete formats and defaults. However, the contact_sheet boolean is only implied through repeated contact-sheet behavior, not explicitly tied to the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'SEE with your own vision' across document figures, image URLs, and video frames. It also distinguishes itself from siblings like omniseek_read and omniseek_transcribe by positioning itself as the visual counterpart and the two-step outline workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Routing rules are explicit: kind='auto' sends document paths/extensions to document figures, video URLs/suffixes to video frames, and everything else to image URLs. It also gives clear when-to-use guidance for render_pages on vector-heavy pages, and recommends pairing with omniseek_transcribe for both visual and audio halves.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 18 tool updatesv0.2.0
    • First observedomniseek_coauthors
    • First observedomniseek_curator_act
    • First observedomniseek_curator_view
    • First observedomniseek_field_skeleton
    • First observedomniseek_gather
    • First observedomniseek_graph
    • First observedomniseek_institution_cohort
    • First observedomniseek_paper_enrich
    • First observedomniseek_paper_recommend
    • First observedomniseek_read
    • First observedomniseek_resolve_identity
    • First observedomniseek_ruling
    • First observedomniseek_search
    • First observedomniseek_sensor
    • First observedomniseek_sources
    • First observedomniseek_statement
    • First observedomniseek_transcribe
    • First observedomniseek_view

TDQS

A4.7/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a clearly distinct resource or action: search, paper metadata enrichment, field citation graphs, author resolution, coauthorship, institution rosters, document/audio/image reading, source curation, parallel gathering, evidence graph views, sensors, and graph rulings/statements. Potential overlaps like omniseek_read vs omniseek_view or omniseek_ruling vs omniseek_statement are explicitly separated and cross-referenced, so routing between them is reliable.

Naming Consistency4/5

All tools share the omniseek_ prefix and use consistent lowercase snake_case, which makes the surface feel uniform and predictable. However, the suffix pattern is not fully consistent: some are single verbs (search, read, view), some are nouns (sources, graph, sensor), and some are object-verb compounds (paper_enrich, resolve_identity).

Tool Count4/5

Eighteen tools is slightly above the typical sweet spot, but the server's purpose is genuinely broad: search, deep reading, media understanding, paper analytics, person/institution graphs, source curation, persistent memory, and monitoring. Each tool appears to earn its place, and the administrative pairs (curator_view/curator_act, ruling/statement) add cohesion rather than padding.

Completeness5/5

The tool surface covers the full research lifecycle: discover (search, sources), consume (read, transcribe, view), analyze (paper_enrich, field_skeleton, paper_recommend, coauthors, institution_cohort), persist (ruling, statement, sensor), and administer (curator, gather). Tools are explicitly designed with handoffs between them, such as resolve_identity to coauthors, read outlines to view figures, and fire-then-collect search, with no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server giving AI agents real-time web search, page scraping, company intelligence, email discovery, local lead generation, and a persistent knowledge graph. Pay only for what you use, no subscriptions.
    12 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A private, self-hosted MCP server that wraps a retrieval pipeline over your own data, enabling trusted AI agents to access and manage your personal memory through standard MCP tools.
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that enables AI agents to watch and analyze videos from 1800+ sources, with persistent indexing, OCR, transcription, and a self-verification loop for debugging.
    MIT