Skip to main content
Glama
ptrken01

searxng-mcp-scraper

by ptrken01

searxng-mcp-scraper

MCP server exposing SearXNG search and HTTP fetch tools for AI agents.

A self-contained Model Context Protocol server that turns SearXNG (a self-hosted metasearch engine) into two MCP tools you can wire into Claude Desktop, Cursor, or any MCP-compatible client:

  • search(query, ...) — ranked web results from SearXNG's JSON API

  • fetch(url) — cleaned main text of any public http(s) URL

No API keys, no third-party tracking, no rate limits beyond what your SearXNG instance imposes.

Installation

# From source (recommended during dev)
git clone https://github.com/your-org/searxng-mcp-scraper
cd searxng-mcp-scraper
uv sync --extra dev
uv pip install -e .

# Or with plain pip
pip install -e .

Related MCP server: searxng-mcp

Configuration

The server reads configuration from environment variables (or a .env file at startup):

Variable

Required

Default

Description

SEARXNG_BASE_URL

yes

Base URL of your SearXNG instance, e.g. http://localhost:8888

SEARXNG_DEFAULT_CATEGORY

no

general

Default search category

SEARXNG_DEFAULT_ENGINES

no

wiby,naver,seznam,marginalia,wikipedia,duckduckgo_html

Default engine list when a caller doesn't pass engines. Curated to the keyless engines that return results from this machine's egress IP (Brave/Google/Startpage/DuckDuckGo are rate-limited here). Set to empty to use SearXNG's own default set.

SEARXNG_DEFAULT_LANGUAGE

no

en

Default language code

SEARXNG_DEFAULT_SAFESEARCH

no

0

Default safesearch: 0/1/2

SEARCH_MAX_RESULTS_CAP

no

50

Hard cap on results per call

SEARCH_TIMEOUT_S

no

30

HTTP timeout (seconds) for search

FETCH_TIMEOUT_S

no

20

HTTP timeout (seconds) for fetch

FETCH_MAX_BYTES

no

5_000_000

Refuse to read more than this many bytes per fetch

FETCH_MAX_REDIRECTS

no

5

Max HTTP redirects to follow

FETCH_ALLOW_PRIVATE

no

false

Allow fetching private/loopback URLs (SSRF guard, default on)

USER_AGENT

no

searxng-mcp-scraper/0.1

User-Agent header for all requests

LOG_LEVEL

no

INFO

Stderr log verbosity: DEBUG/INFO/WARNING/ERROR

MCP_HOST

no

127.0.0.1

Bind host when --transport streamable-http

MCP_PORT

no

8765

Bind port when --transport streamable-http

MCP_CORS_ORIGINS

no

http://localhost,http://localhost:*,http://127.0.0.1,http://127.0.0.1:*

Comma-separated CORS allow-origins. Use * to allow any origin (not recommended on LAN).

BLOG_SCRAPE_OUTPUT_DIR

no

~/scraped-blogs

Directory for scrape_blog / deep_scrape Markdown output and assets

BLOG_SCRAPE_MAX_POSTS

no

200

Max post pages per blog scrape

BLOG_SCRAPE_CONCURRENCY

no

5

Max parallel post fetches

BLOG_SCRAPE_DISCOVERY_PAGES

no

10

Max HTML index pages to scan when no feed is found

DEEP_SCRAPE_MAX_DOCUMENTS_PER_BLOG

no

100

Max linked documents downloaded/extracted by one deep_scrape call

DEEP_SCRAPE_MAX_DOCUMENT_BYTES

no

50_000_000

Refuse a single linked document above this size

DEEP_SCRAPE_MAX_IMAGES_PER_BLOG

no

200

Max images downloaded by one deep_scrape call

DEEP_SCRAPE_MAX_IMAGE_BYTES

no

15_000_000

Refuse a single image above this size

DEEP_SCRAPE_CONCURRENCY

no

5

Max parallel document/image downloads during deep_scrape

FIRECRAWL_FALLBACK_ENABLED

no

true

Retry a failed/thin static fetch through Firecrawl (see below)

FIRECRAWL_BASE_URL

no

http://127.0.0.1:8788

Firecrawl API base — the local keyless proxy by default

FIRECRAWL_API_KEY

no

Optional. Empty uses the keyless free tier

FIRECRAWL_TIMEOUT_S

no

60

Timeout for a fallback scrape (Firecrawl renders before responding)

FIRECRAWL_MIN_TEXT_CHARS

no

500

Static extractions shorter than this are treated as failures and retried

Note: your SearXNG instance must have json enabled in search.formats under settings.yml, or search will return searxng_unavailable with a 403.

PDF extraction (optional, local, keyless)

deep_scrape downloads linked PDFs and extracts their text. By default it uses markitdown. For a much faster and cleaner text extraction on text-based PDFs, install the optional extra:

uv sync --extra pdf-extras          # or: pip install "searxng-mcp-scraper[pdf-extras]"

This pulls in pdf-inspector — Firecrawl's open-source Rust PDF engine (no API key, no cloud, runs locally). When installed, PDF extraction routes through it first:

  • text-based PDFs are read straight from the PDF internals (fonts, text operators) in milliseconds.

  • scanned / image-only PDFs are correctly classified as needing OCR (the library reports pdf_type: scanned). It has no OCR of its own, so those fall through to markitdown (which may have an OCR backend); if markitdown also returns nothing, the document surfaces an honest DocumentExtractionFailed instead of a silent empty string.

The dependency is optional: without it, PDFs simply use markitdown. Nothing in the core package depends on a native wheel.

Firecrawl fallback (JS-rendered pages)

fetch does a plain HTTP GET and runs trafilatura over the HTML. That is fast and free, but it returns nothing useful for client-rendered pages: the served body is an empty root div, so trafilatura scrapes up the meta description and a nav label and returns a couple hundred characters of noise. Measured on real sites:

URL

static

with fallback

vercel.com/templates

208 chars

15,972

notion.so/product

156 chars

7,737

linear.app/method

326 chars

1,126

excalidraw.com

57 chars

655

app.slack.com

2,764 chars

2,764 (static kept — already good)

When a fetch errors, returns empty text, or returns fewer than FIRECRAWL_MIN_TEXT_CHARS, the URL is retried once through Firecrawl's /v2/scrape, which renders the page server-side and returns clean markdown. Results carry extractor: "firecrawl" so you can tell which path produced them.

Firecrawl's hosted API has a keyless free tier for /v2/scrape and /v2/search, so this costs nothing and needs no account. The catch: the tier rejects any Authorization header, while most clients insist on sending one. FIRECRAWL_BASE_URL therefore points at a small local proxy that strips the header:

python3 scripts/firecrawl_keyless_proxy.py   # 127.0.0.1:8788

The proxy is vendored here (no external dependency) and forwards a real key if you set FIRECRAWL_UPSTREAM_KEY in its environment — which unlocks /v2/map, /v2/crawl, and /v2/extract through the same URL. Key-gated paths without a key get a clear error rather than a confusing upstream 403.

Set FIRECRAWL_API_KEY and point FIRECRAWL_BASE_URL at https://api.firecrawl.dev to skip the proxy and use a real account instead.

The fallback never overrides a guard. invalid_url and private_network_blocked are SSRF/scheme decisions, not extraction failures — routing those through a third-party renderer would defeat the guard, so they are excluded. oversize is excluded too (re-rendering the same huge page just burns the cap again). If the fallback fails or returns less text than the static path, the original result is kept unchanged. Set FIRECRAWL_FALLBACK_ENABLED=false for fully air-gapped runs.

Running

The server supports two transports. Pick the one your MCP client speaks:

stdio (default — Claude Desktop, Cursor, etc.)

# From a checkout, with .env in the cwd
SEARXNG_BASE_URL=http://localhost:8888 searxng-mcp-scraper

# Or via uv
SEARXNG_BASE_URL=http://localhost:8888 uv run searxng-mcp-scraper

# Or as a module
SEARXNG_BASE_URL=http://localhost:8888 python -m searxng_mcp_scraper

The server speaks MCP over stdio. It writes logs to stderr; stdout is reserved for the JSON-RPC stream and must not be polluted.

streamable-http (llama-ui, Open WebUI, browser-based clients)

SEARXNG_BASE_URL=http://localhost:8888 uv run searxng-mcp-scraper --transport streamable-http

This binds to http://127.0.0.1:8765/mcp by default. Override with MCP_HOST / MCP_PORT env vars. CORS is pre-configured for http://localhost:* and http://127.0.0.1:* — any browser on your machine can connect.

If you need to bind to 0.0.0.0 (LAN), set MCP_CORS_ORIGINS to a narrower list. There is no auth in v1 — do not expose this to the public internet without putting it behind a reverse proxy with auth.

llama-ui / Open WebUI config

For browser-based MCP clients, run the server in HTTP mode and paste the URL into the client's "MCP server URL" field:

  1. In one terminal:

    SEARXNG_BASE_URL=http://localhost:8888 uv run searxng-mcp-scraper --transport streamable-http
  2. In the UI, add a new MCP server with URL http://127.0.0.1:8765/mcp (no auth headers required for local).

  3. The search and fetch tools will appear in the model's tool list.

Claude Desktop config

Add this to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "searxng-scraper": {
      "command": "searxng-mcp-scraper",
      "env": {
        "SEARXNG_BASE_URL": "http://localhost:8888"
      }
    }
  }
}

If you installed from source and the binary isn't on your PATH, point command at uv:

{
  "mcpServers": {
    "searxng-scraper": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/searxng-mcp-scraper", "run", "searxng-mcp-scraper"],
      "env": {
        "SEARXNG_BASE_URL": "http://localhost:8888"
      }
    }
  }
}

Restart Claude Desktop; you should see search and fetch tools appear.

Tool reference

search(query, ...) -> {results, suggestions, number_of_results}

Parameter

Type

Default

Description

query

string

(required)

Search query string

categories

list[string]

["general"]

SearXNG categories, e.g. ["general"], ["images"]

engines

list[string]

null

Restrict to specific engines, e.g. ["google", "bing"]

language

string

"en"

Language code

pageno

int

1

Page number (1-indexed)

time_range

"day"/"month"/"year"/null

null

Time filter

safesearch

0/1/2

0

Safe-search level

max_results

int

10

Cap on results returned (1–50)

fetch(url) -> {url, final_url, content_type, text, byte_count}

Parameter

Type

Description

url

string

An http:// or https:// URL

Strips <script>, <style>, <nav>, <header>, <footer>, <aside> blocks via trafilatura, and collapses whitespace. Refuses non-http(s) schemes and (by default) private network targets. Returns a structured error on timeout, oversize, or non-2xx — never crashes.

scrape_blog(blog_url) -> {output_path, post_count, ...}

Discovers a blog's RSS/Atom feed first, falls back to scanning HTML index pages, fetches post text, and writes one Markdown file under BLOG_SCRAPE_OUTPUT_DIR.

deep_scrape(blog_url) -> {output_path, assets_dir, documents_*, images_*}

Does everything scrape_blog does, plus:

  • discovers linked documents from each post (.pdf, .docx, .csv, .md, etc.)

  • downloads raw document files into deep_assets/

  • extracts document text with MarkItDown and embeds it in the Markdown output

  • discovers images from <img src>, lazy-load attributes, srcset, and direct image links

  • downloads bounded image files into deep_assets/images/

  • records per-image URL, saved path, content type, byte count, and any failure in the Markdown

The returned summary includes images_found, images_saved, and image_byte_count. One bad image/document is recorded in-band and does not fail the whole blog scrape.

Development

uv run pytest          # run the full test suite
uv run mypy src        # static type checks
uv run ruff check      # lint

License

MIT.

Available Tools

4 tools
deep_scrapeA

Discover every post on a blog, fetch each, AND download + extract every linked document (PDF/DOCX/XLSX/PPTX/CSV/JSON/XML/MD/EPUB/...).

Same discovery as `scrape_blog` (RSS/Atom first, HTML index
fallback). For every post fetched, the raw HTML is scanned for
links whose URL ends in a recognized document extension. Each
such document is downloaded (capped by
`deep_scrape_max_documents_per_blog`, 100 by default) and its
text is extracted via markitdown. The original blog post text
and every document's extracted text are all inlined into one
Markdown file at:

  {blog_scrape_output_dir}/<safe-host>_<safe-path>_<unix-ts>_deep.md

Downloaded binaries are saved alongside, under:

  {blog_scrape_output_dir}/deep_assets/

Per-post and per-document failures are noted in-band as
`- Fetch error: <code>` / `- Error: <code>` bullets, not by
aborting the whole run. The returned summary dict only carries
an `error` field when discovery itself failed (no posts).

Args:
    blog_url: Root URL of the blog (e.g. "https://blog.example.com/").

Returns:
    Small summary dict — never the file contents:
      {blog_url, output_path, assets_dir, post_count, post_count_ok,
       documents_found, documents_extracted, post_byte_count,
       document_byte_count, duration_s, discovery}
    On failure: {blog_url, error: <stable_code>, message}.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctxNo
blog_urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 full burden and does so excellently. It discloses output file paths, per-post and per-document error handling (failures noted in-band), the document count cap, binary asset location, and the exact return dict shape including failure modes. This is far beyond typical transparency.

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?

Although lengthy, the description is well-structured with clear sections (overview, discovery, output paths, error handling, args, returns). Every sentence adds meaningful information, and the formatting (code blocks, bullet lists) aids readability without waste.

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?

The tool is complex with many behaviors, but the description fully covers inputs, outputs, error semantics, file paths, and even operational limits. The output schema is also provided, but the description redundantly explains the return dict, which is acceptable given the richness. No critical gaps exist.

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?

The input schema has 0% description coverage, but the tool description explains the required parameter blog_url ('Root URL of the blog') and adds essential behavioral context (e.g., the deep_scrape_max_documents_per_blog env var). However, the optional 'ctx' parameter is left unexplained, and no details are given about its expected format or purpose.

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 specific verbs ('Discover', 'fetch', 'download + extract') and clearly identifies the resource (blog posts and linked documents). It explicitly distinguishes itself from the sibling tool scrape_blog by describing the additional document handling, making the purpose unambiguous.

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 clearly states the tool's scope ('Same discovery as scrape_blog' plus document extraction) and provides detailed behavior, but it does not explicitly say when to prefer this over scrape_blog or under what conditions to avoid it. The context strongly implies the usage distinction, but a direct when/when-not statement is missing.

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

fetchA

Fetch a URL and return its cleaned main text content.

Args:
    url: An http:// or https:// URL.

Returns:
    Dict with `url`, `final_url`, `content_type`, `text`, `byte_count`,
    and on error an `error` field with a stable string code.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctxNo
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/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. It transparently lists the return fields (url, final_url, content_type, text, byte_count) and mentions an error field with a stable string code. However, it does not discuss cleaning behavior, redirects, timeouts, size limits, or other operational details that could affect usage.

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 concise and well-structured: a single sentence stating the core behavior, followed by an Args block and Returns block. Every sentence provides necessary information without fluff, and the most important information (what the tool does) is front-loaded.

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

Completeness3/5

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

The tool is relatively simple, and the description provides a clear functional overview and return contract. However, it lacks usage guidance relative to sibling tools and does not define the 'stable string code' values or content type semantics. Given the low annotation coverage and the existence of sibling tools, the description is adequate but incomplete for fully-informed invocation.

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. It does explain the 'url' parameter as requiring an http:// or https:// URL, which adds meaning beyond the schema. However, the 'ctx' parameter is not described at all, leaving a gap in parameter understanding.

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 the tool's function: 'Fetch a URL and return its cleaned main text content.' This is a specific verb+resource combination that distinguishes it from siblings like search, scrape_blog, and deep_scrape by emphasizing the 'cleaned main text' output.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives. The description does not mention any exclusions, prerequisites, or comparisons to sibling tools. It only provides the purpose and return format, leaving usage context entirely to the agent.

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

scrape_blogA

Discover every post on a blog and write a single aggregated Markdown file.

Tries the blog's RSS/Atom feed first (common paths like /rss.xml,
/feed, /atom.xml). If no feed responds, crawls the HTML index
(up to blog_scrape_discovery_pages pages). Each discovered post
URL is fetched in parallel and its cleaned main text is appended
to one Markdown file at:

  {blog_scrape_output_dir}/<safe-host>_<safe-path>_<unix-ts>.md

The file starts with YAML front matter (blog URL, post count,
byte total, duration) followed by one H3 section per post with
its title, original URL, published date (if known from the feed),
content-type, byte count, and the cleaned text. Failures are
noted in-band as `- Fetch error: <code>` bullets, not by aborting
the whole run.

Args:
    blog_url: Root URL of the blog (e.g. "https://blog.example.com/").

Returns:
    Small summary dict — never the file contents:
      {blog_url, output_path, post_count, post_count_ok, byte_count,
       duration_s, discovery}
    On failure: {blog_url, error: <stable_code>, message}.
ParametersJSON Schema
NameRequiredDescriptionDefault
ctxNo
blog_urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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. It discloses the two-phase discovery strategy, parallel fetching, output file location and naming, YAML front matter contents, in-band error handling ('- Fetch error: <code> bullets, not by aborting'), and that the return value is a summary dict, never the file contents. 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.

Conciseness5/5

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

The description is long but every sentence earns its place, covering purpose, algorithm, output format, error handling, arguments, and return value. It is front-loaded with the core purpose and uses structured headings (Args, Returns) for scannability.

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 two parameters, no annotations, and an output schema, this description is remarkably complete: it explains discovery limits, output path, file structure, in-band error behavior, and the exact return dict on both success and failure. It leaves no critical operational gap.

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 the only meaningful parameter, blog_url, with type, purpose, and an example. The ctx parameter is auto-injected and left unexplained, but this is acceptable; the description adds substantial meaning beyond the sparse 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 verb+resource+action: 'Discover every post on a blog and write a single aggregated Markdown file.' It clearly distinguishes this from sibling tools like fetch (single-page fetch) and search (web search) by emphasizing blog-wide discovery and file output.

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 implies the use case: use this when you want all posts from a blog aggregated into one Markdown file. It details the strategy (RSS/Atom first, then HTML crawl) but does not explicitly state when to prefer this over alternatives or when not to use it, so it falls just short of a 5.

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. 4 tool updatesv0.1.0
    • First observeddeep_scrape
    • First observedfetch
    • First observedscrape_blog
    • First observedsearch

TDQS

A4/5.0
Disambiguation4/5

The tools are mostly distinct: search performs queries, fetch retrieves a single URL, while scrape_blog and deep_scrape both focus on blog content aggregation. The overlap between scrape_blog and deep_scrape is clear (deep_scrape is an extended version), but both descriptions are detailed enough to avoid confusion in practice.

Naming Consistency3/5

The names mix conventions: 'search' and 'fetch' are single generic verbs, 'scrape_blog' follows a verb_noun pattern, and 'deep_scrape' is an adjective_verb compound. While each name is readable and descriptive, the lack of a uniform pattern makes the set feel slightly inconsistent.

Tool Count5/5

With only 4 tools, the server is well-scoped for its purpose. Each tool covers a distinct aspect of web scraping and search: querying, single-page extraction, blog aggregation, and deep scraping with document extraction. No tool feels redundant or unnecessary.

Completeness4/5

The tool surface covers the core workflows: web search, URL fetching, blog scraping, and extended scraping with document extraction. Minor gaps exist, such as a generic crawling tool for non-blog sites, but these are not critical given the server's stated focus on search and blog content.

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A lightweight MCP server that enables LLMs to search the web via DuckDuckGo, search GitHub code repositories, and extract clean content from web pages in LLM-friendly formats.
    8
    -
  • F
    license
    A
    quality
    C
    maintenance
    MCP server that provides a search_web tool to query a self-hosted SearXNG instance and return structured web search results.
    1
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    A self-hosted MCP server providing private web search, web page fetching, and current date/time tools, powered by a bundled SearXNG instance for API-key-free local search.
    2
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP server that provides web search scraping from DuckDuckGo (with Mojeek fallback) and URL content fetching as markdown/text or raw HTML.
    1
    -

Latest Blog Posts

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/ptrken01/searxng-mcp-scraper'

If you have feedback or need assistance with the MCP directory API, please join our Discord server