IDagntn@agntn/*

One interface. Every provider.

Every library takes one domain and puts one TypeScript interface in front of all the providers in it. You get it as a library, a CLI, an AI SDK tool, an MCP server and Pi and OMP extensions. Change the provider string, the rest of your code stays.

Libraries
22
in 5 domains
On npm
14
10 with a docs site
Providers
135+
named in the catalogue
Install$ pnpm add @agntn/web
ID@agntn/web01 / 14Web · docs
Library / Web

@agntn/web

Web search, reverse image search and page reading over Brave, Exa, Tavily, Firecrawl, Jina, SearXNG and six more.

Providers

  • Brave
  • Exa
  • Tavily
  • Firecrawl
  • Jina
  • SearXNG
  • Mojeek
  • SerpAPI
  • SerpBase
  • TinyFish
  • Context
  • OpenAI Codex
Status
docs
Providers
12
Repository
public
Docs
web.agntn.dev
surfaces 6 / 6

Same calls, every library

Pick the domain, pick the provider by name, call the method. Web search, package registries, git forges, block explorers, the call site looks the same. This file walks through the 14 published libraries, one real export each.

  • create('name') resolves a registered class. Adapters register themselves, nothing to extend by hand
  • Every answer is the shared type. Provider quirks stay in the adapter and never leak out
  • Typed errors: RateLimitError with retryAfter, NotFoundError, HTTPError with the key already redacted
Read How a library is built
Fileagent.ts@agntn/web

Call

import { create } from "@agntn/web";const provider = await create("brave");const answer = await provider.search("typescript 7 native", { maxResults: 5 });// [{ url, title, snippet }], the same shape from every engine
Installpnpm add @agntn/web
Docsweb.agntn.dev

Write once, run from any host

A human types the command in a shell. An agent calls the same executor through MCP, the Vercel AI SDK, Pi or OMP. Same answer, same provider diagnostics, so what the model reads is what you'd have read yourself.

  • CLI, MCP server and the Pi and OMP extensions share one set of tool executors
  • AI SDK tools come from the /ai subpath with Zod schemas, the host abort signal passed straight through
  • Nothing bundled twice. The extension sources ship inside the npm package
Read Library, CLI, AI SDK, MCP, Pi, OMP
Listsurfacesone set of executors
Library
ESM, strict TypeScript, typed errors.
CLI
Same calls from a shell, --json for scripts.
AI SDK
Vercel AI SDK tools from the /ai subpath.
MCP
One server over stdio for every host.
Pi
Extension shipped inside the package.
OMP
Same executors, OMP packaging.
Written once / called from every host

5 domains, 22 libraries

Published ones link to their page here, with the docs site or the npm package from there. The rest are still in private repos and sit here so you know what's coming.

List@agntn/*22 libraries · 14 on npm

Web

Code

Chains

Agents

Data

Boring on purpose

Every repo starts from the same template and keeps the same scripts, so jumping from one library to the next costs nothing. All of it is before 1.0, pin exact versions.

  • Node.js 22 or 24 and up per package, ESM only, strict TypeScript
  • obuild, vitest, oxlint and oxfmt through the shared @agntn/ox policy
  • Releases from GitHub Actions with npm trusted publishing, no tokens lying around
Read Stack and conventions
Listscriptsevery repo
# same scripts in every @agntn packagepnpm build       # obuild, ESM, .d.mtspnpm test        # vitestpnpm lint        # oxlint + oxfmt via @agntn/oxpnpm typecheck   # tsc, TypeScript 7pnpm release     # changelogen, OIDC publish
Same template / same scripts
Startpnpm add @agntn/webNode.js 22 or 24, per package

Pick a domain, add one package

One install gives you the library, plus the CLI and the MCP server where the package ships them. Name a provider, ask it something, read the same shape whoever answered.

  • PinEverything is before 1.0, so pin exact versions.
  • KeysEach provider reads its key from its own env var unless you hand one to create().
  • SwapChange the string in create() and the rest of the file stays.

First call

$ pnpm add @agntn/webimport { create } from "@agntn/web";const brave = await create("brave");const results = await brave.search("typescript 7 native");// [{ url, title, snippet }], the same shape from every engine