verifind-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@verifind-mcpFind me 3 real wireless earbuds under $50 with good bass"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
verifind-mcp
An MCP server with one tool: find real things matching whatever shape you ask for, and never invent one. Products, job postings, event tickets, opportunities, apartments — you give it a plain-language query and a JSON Schema for what one result should look like. It runs a real web search, has a model restructure only what that search actually returned into your shape, then checks every result's source URL in code against the literal search results. If a claim can't be traced back to a real fetched page, that item is dropped — not guessed at, not "corrected," dropped.
Search → restructure into your schema → verify the source in code → return only what survives.
Built entirely on free-tier APIs — Tavily for search, any OpenAI-compatible endpoint (Groq by default) for extraction. No credit card required for either.
The problem, in one exchange
Ask a raw LLM to "find" something and it will, whether or not that thing actually exists:
You: Find me 3 real wireless earbuds under $50 with good bass. Raw LLM (illustrative — not a real call): 1. AudioMax Pro X200 — $42.99, deep bass, 30hr battery. 2. SoundWave Elite S3 — $38.50...
Confident, specific, and — unless you happen to already know this market — completely unverifiable. Neither product may exist.
Here's verified_search on the same question, actual output from examples/smoke.ts against live Tavily + Groq, unedited:
{
"items": [
{ "name": "Treblab WX8", "highlight": "Listed under “Best Bass Wireless Earbuds under $50”", "sourceUrl": "https://headphonesaddict.com/best-bluetooth-earbuds-under-50" },
{ "name": "TOZO NC2", "price": "$40", "highlight": "Described as having heavy bass and priced at $40", "sourceUrl": "https://www.soundguys.com/the-best-wireless-earbuds-under-50-156056" }
],
"itemsExtracted": 4,
"itemsDropped": 0
}Every sourceUrl above is a real page this tool actually fetched — click one, it's there. That's the entire point of the project.
Related MCP server: Web Search MCP Server
Why this exists
This started as one piece of a different project (a CRM that finds paid photography gigs): a pattern for asking an LLM to "find real things" without it confidently hallucinating half of them. That pattern turned out to have nothing to do with photography — it generalizes to anything an agent might need to look up on the live web with a straight-faced answer instead of a plausible-sounding guess.
The core problem: an LLM asked to "find X" will happily invent X. The fix is splitting retrieval from extraction: a real search API fetches real pages, and the model is only ever allowed to restructure those specific results — never asked to know things directly. See
src/verifiedSearch.ts.The guarantee is enforced in code, not by asking nicely. Every result schema gets a
sourceUrlfield injected automatically (even if the caller's schema didn't include one), and after the model responds, that field is checked against the literal set of URLs the search actually returned — in aSet, not by trusting the model's word. A result citing an unlisted or fabricated URL is dropped, unconditionally, no exceptions.Fully generic, not a fixed set of "modes." The result shape is a JSON Schema the caller supplies per call — there's no hardcoded
ProductorJobPostingtype anywhere in this codebase. The same tool that found the earbuds above can find event tickets or apartment listings, because the shape of "a result" is an input, not a design decision baked into the server.Honest about where the guarantee is strong vs. weak. A
sourceUrlis either genuinely one of the fetched pages or it isn't — that's a hard, checkable fact, enforced by aSet.has()call, not a vibe. Apriceornamefield is only as good as the model's transcription of the source text; nothing stops it from misreading a number. This README says that outright instead of implying every field carries the same guarantee.
Architecture
flowchart LR
Q["query + JSON Schema"] --> S["Tavily search"]
S -->|"real search results"| E["LLM extraction"]
E -->|"structured JSON"| V{"Validate"}
S -->|"actual URLs fetched"| V
V -->|"schema-valid AND source verified"| KEEP["Kept items"]
V -->|"fails either check"| DROP["Dropped, reason recorded"]The LLM never searches the web itself — it only ever sees the exact search results verifiedSearch already fetched, wrapped as clearly-labeled untrusted data (see src/security.ts, this project's prompt-injection defense against hostile page content trying to redirect the model's behavior).
Tech stack
Piece | Choice |
Language | TypeScript |
Protocol |
|
Search | Tavily — free tier, no card |
Extraction | Any OpenAI-compatible chat completions endpoint — defaults to Groq, free tier, no card |
Schema validation |
|
Testing | Vitest — unit tests mock Tavily/the LLM; |
Repository layout
src/
index.ts MCP server entrypoint — registers the verified_search tool
verifiedSearch.ts The whole pipeline: search -> extract -> validate -> verify
tavily.ts Real web search client
security.ts Wraps untrusted web content for safe LLM inclusion
json.ts Tolerant JSON parsing for model output
env.ts Env validation
logger.ts stderr-only logger (stdout is the MCP protocol channel — never log there)
examples/
smoke.ts Live end-to-end call against real APIs, no MCP involved
mcp-smoke.ts Live call through the actual MCP client/server stdio protocolQuick start
git clone https://github.com/<you>/verifind-mcp.git
cd verifind-mcp
npm install
cp .env.example .env # fill in TAVILY_API_KEY and LLM_API_KEY (both free, no card)
npm run build
npx dotenv -e .env -- npx tsx examples/smoke.tsThat last command hits real APIs and prints real, sourced results — no MCP client required to see it work.
Prerequisites
Node.js 20+
A free Tavily API key
A free Groq API key (or any other OpenAI-compatible endpoint you'd rather point at)
Using it as an MCP server
Register it with any MCP-compatible client — e.g. Claude Desktop's claude_desktop_config.json:
{
"mcpServers": {
"verifind": {
"command": "node",
"args": ["/path/to/verifind-mcp/dist/index.js"],
"env": {
"TAVILY_API_KEY": "...",
"LLM_API_KEY": "..."
}
}
}
}Then ask the client something like: "Use verified_search to find me three real budget mechanical keyboards under $60, with name, price, and sourceUrl."
To try it without any MCP client:
npx dotenv -e .env -- npx tsx examples/smoke.ts # calls verifiedSearch() directly
npx dotenv -e .env -- npx tsx examples/mcp-smoke.ts # calls it through the real stdio protocolTesting
npm testUnit tests mock Tavily and the LLM — no network calls, no API keys needed. The examples/ scripts are the real, live check: they hit actual Tavily and Groq endpoints and print real results, the same way the earbuds output above was generated.
Limitations, honestly
Free-tier rate limits (Tavily's request quota, Groq's per-minute token budget) apply — this isn't built for high-volume production traffic without upgrading those.
The
sourceUrlguarantee is real and code-enforced. Every other field is the model's best-effort transcription of the source text — good, but not independently verified the way the URL is.Search quality depends entirely on Tavily's index for the query given; a query with no good public results returns few or no items rather than a forced answer, which is the intended behavior, not a bug.
Contributing
This is deliberately domain-agnostic — if you use it for something (job boards, real estate, event tickets, anything), an example schema under examples/ showing that use case is a genuinely useful PR. Issues and schema-design questions welcome too.
License
MIT — see LICENSE.
Available Tools
1 toolverified_searchA
Finds real things matching a query — products, opportunities, tickets, jobs, events, whatever — by running a real web search and having a model restructure ONLY what that search actually returned into the JSON shape you specify. Every item's source field is checked in code against the literal URLs the search returned, so a result can't be invented or hallucinated: if the model can't back a claim with a real fetched page, that item is dropped rather than guessed at. Give it a plain-language query and a JSON Schema for one result item (sourceField, default "sourceUrl", is added automatically if you don't include it).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to find, in plain language — e.g. "wireless earbuds under $50 with good bass reviews", "remote junior backend roles posted this week". | |
| itemSchema | Yes | A JSON Schema (draft-07 style) object describing the shape of one result item, e.g. {"type":"object","properties":{"name":{"type":"string"},"price":{"type":"string"},"sourceUrl":{"type":"string"}},"required":["name","sourceUrl"]} | |
| maxResults | No | How many live search results to fetch and draw from. Default 5. | |
| sourceField | No | Which field in itemSchema must be a real, verified URL. Default "sourceUrl". |
TDQS
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 excellently. It reveals the critical safety mechanism: every item's source field is validated in code against literal search-result URLs, and unverifiable items are dropped rather than hallucinated. It also discloses that the model restructures ONLY what the search actually returned. This is exactly the kind of behavioral detail an agent needs to trust and safely invoke the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact — three sentences — and each one earns its place. It front-loads the primary purpose, then explains the safety/verification mechanism, and finally gives actionable usage instructions. There is no filler or repetition of schema details that are already present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with nested parameters, no output schema, and no annotations, the description covers the core workflow thoroughly: what it does, how it prevents hallucination, what inputs to provide, and how sourceField is auto-added. The only notable gap is the absence of an explicit description of the return format (e.g., whether it returns a bare array of items or a wrapped object). Still, the description mostly implies the output shape via 'restructure ... into the JSON shape you specify,' making it adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters with examples. The description adds key semantic value beyond the schema: it explains that 'sourceField, default "sourceUrl", is added automatically if you don't include it' — which clarifies an important behavior not fully specified in the schema. It also frames itemSchema as the target shape for restructured results, linking the parameter to the tool's core workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a precise action: 'Finds real things matching a query' by running a real web search and restructuring only returned results into a user-specified JSON shape. The verb is clear, the resource is well-defined ('real things' — products, opportunities, tickets, etc.), and the description distinguishes the tool's core verification behavior from a generic search or extraction tool. Even without siblings, the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: whenever an agent needs real, verifiable web results converted into a structured JSON shape. It also provides practical instructions — 'Give it a plain-language query and a JSON Schema for one result item.' However, it does not explicitly state when NOT to use it or name alternative tools, though no siblings are listed. This is a clear-context-without-exclusions case.
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. Dates show when Glama detected each change.
1 tool update
v0.1.0- First observed
verified_search
TDQS
With only one tool, there is no possibility of confusing it with another. The tool's purpose is clear from its name and detailed description.
A single tool means there is no inconsistent naming convention to worry about. verified_search is clear, readable snake_case and matches the server's purpose.
One tool feels thin, especially since the description claims coverage of many domains like products, jobs, events, and tickets. However, the tool is flexible enough that a single entry point may be reasonable for a narrowly focused server.
The tool covers the core need of verified search with hallucination control and customizable result schemas. It lacks obvious pagination or refinement options, but those are not major dead ends for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Turn any website into structured JSON data matching your custom schema.
Live web search, image search, topic filters and full-text fetch over our own crawled index.
Structured web research tool for AI agents: search, fetch and shape web data into the JSON schema…
LLM-ready web search + instant answers + URL-to-clean-text fetch for agents and RAG.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables Claude and any MCP client to turn a URL plus a schema into validated, typed JSON without HTML parsing or hallucinated fields.423MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to perform web searches, extract webpage content, and conduct end-to-end search-and-extract operations using multiple search providers and content extraction methods.-
- AlicenseAqualityBmaintenanceAn agent-agnostic web extraction and fetch layer that turns URLs into verified, typed data with confidence scores via MCP, REST, or SDK, orchestrating scraping engines behind a resilience ladder and supporting structured extraction against any schema.52Apache 2.0
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to query structured data refined from unstructured web sources, including developer breaking changes, B2B pricing matrices, regulatory compliance, semantic search, and on-demand URL refinement.1-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hemanth-hexo/groundtruth_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server