Skip to main content
Glama

Sora (空)

面向 AI 代理从日本 Web 获取数据的 Self-hosted MCP / REST 集成服务器
All-in-One, Zero-Middleware Web Scraping & Japanese Life Infrastructure Engine for AI Agents

Sora 是一个 All-in-One MCP / REST 服务器,让 LLM 和 AI 代理(Claude Desktop、Cursor、Cline、OpenCodeInterpreter、Dify 等)能够自由、安全地探索和操作 日本 Web 空间与日常基础设施。

它完全不需要外部数据库(Redis / PostgreSQL)或消息队列,仅凭一个包含无头 Chromium 和日语 CJK 字体的单一容器 / 单一二进制文件,即可从每月 800 日元的 VPS 上立即运行。

flowchart LR
    subgraph Clients["AI Clients / Agents"]
        Claude["Claude Desktop / Cursor"]
        Agents["LangChain / AutoGen / Dify"]
    end

    subgraph Sora["Sora All-in-One (Distroless / Bun)"]
        direction TB
        MCP["MCP Server (Streamable HTTP / SSE)"]
        REST["Hono REST API (OpenAPI 3.0)"]
        Auth["Timing-Safe Auth & SSRF Guard"]
        LRU["True LRU In-Memory Cache"]
        
        subgraph Engine["Dual Scrape Engine"]
            Fast["Static Fetch + Readability + AI Chunker"]
            Browser["Stealth Chromium + Browser DSL (Tabs/Clicks)"]
        end

        subgraph JP["Japan Life Infrastructure"]
            JMA["気象庁 1,805自治体 天気予報"]
            Transit["Yahoo! 路線乗換・IC運賃"]
            Yahoo["Yahoo! リアルタイム(X)/知恵袋/ニュース/画像/動画"]
        end
    end

    subgraph Web["Public Internet"]
        Sites["Web Sites / PDFs / SPAs"]
        PublicData["気象庁 / Yahoo / X"]
    end

    Clients <-->|MCP / REST| Sora
    Fast --> Sites
    Browser --> Sites
    JP --> PublicData

⚡ 5 秒连接的 Quickstart (Claude Desktop / Cursor / Cline)

只需在您使用的 AI 代理的配置文件(claude_desktop_config.json 等)中添加以下内容,即可立即启用 16 种强大的工具集。

① Remote MCP (HTTP / SSE) 连接

在 Sora 容器启动的状态下指定 URL:

{
  "mcpServers": {
    "sora": {
      "url": "http://localhost:3016/mcp"
    }
  }
}

② 使用 Docker / Podman 一键启动

docker run -d -p 3016:8000 --name sora ghcr.io/ikenokazuki/sora:latest

Related MCP server: ToolCenter MCP

🌟 主要特点与优势 (Why Sora?)

  1. 🗾 日本日常基础设施 & Web 探索的全面覆盖:

    • 提供海外工具(Firecrawl / Tavily)无法支持的「Yahoo! 知恵袋」「X (Twitter) 实时速报」「气象厅官方开放数据直连(全国 1,805 个市区町村自动选定)」「电车换乘指南」,全部整合在单一 MCP 中。

  2. ⚡ 压倒性的毫秒级响应 & 超低内存消耗:

    • 通过 Bun 原生编译,API 响应 1.5ms,常驻内存 JS 堆 ~32MB / 总计 ~140MB。将 AI 代理的等待时间缩短到极致。

  3. 📦 完全 All-in-One & 零中间件:

    • 完全不需要 Redis、PostgreSQL、外部工作队列等。仅凭单一二进制文件 / 单一容器即可立即完成。

  4. 🛡️ Distroless(无 Shell)& 严格的安全机制:

    • 基础镜像采用 gcr.io/distroless/cc-debian12。容器内不存在 /bin/sh、bash、curl 等,使 RCE(任意代码执行)攻击失效。

    • 标准配备 SSRF / DNS Rebinding 阻断、通过常数时间比较防止 Timing Attack、浏览器会话所有权隔离、DoS 防御(Body Limit 10MB)。

  5. 🕹️ 有状态的浏览器操作 DSL:

    • 可通过 API / MCP 直接控制 open → fill → click → screenshot → evaluate 的多轮交互式浏览器会话。


📊 性能 & 架构对比

项目

Sora (本工具)

Firecrawl (自托管)

一般的 Node/Python 制 MCP

API / 健康检查响应

1.5 ms (0.0015s)

20〜50 ms

30〜100 ms

启动时间 (冷启动)

< 10 ms

10〜30 秒 (多个服务)

1〜3 秒

常驻内存消耗 (RSS)

约 140 MB (JS 堆 ~32MB)

2GB〜4GB+

250MB〜800MB

镜像大小 (Total)

约 1.18 GB (内含 Chromium+日语字体)

4GB〜6GB+ (多个镜像合计)

800MB〜2.5GB

所需容器架构

单一容器 (All-in-One)

5〜6 个 (Redis/PG/Workers)

多个 MCP 进程杂乱运行

安全设计

Distroless (无 Shell・非 root)

通常 Debian/Alpine

通常 Debian/Ubuntu

日本本地信息

完全支持 (天气・换乘・知恵袋・X)

不支持 (仅 Web)

需要单独安装插件


⏱️ 各端点的实测响应速度 (Measured Latency: Cold vs Cached)

以下是在实际本地服务器上「首次获取(非缓存时)」与「缓存命中时」的实测延迟一览。与 AI 代理思考、生成的时间(1〜3 秒)相比,响应速度极为迅速。

端点

首次获取 (非缓存时)

缓存时 (第 2 次以后)

处理内容・技术特点

GET /health

0.2 〜 1.8 ms

—

API 存活监控・健康检查(Bun 优化)

GET /weather (气象厅天气)

约 38 ms

0.4 〜 0.7 ms

气象厅官方 CDN(jma.go.jp)直连解析+1,805 个自治体自动选定

POST /scrape (静态最快模式)

约 79 ms

0.5 〜 1.0 ms

Web 页面的高速抓取+Markdown 正文提取

POST /scrape (SPA 自动升级 / 浏览器渲染)

约 1.2 〜 1.6 秒

0.5 〜 1.0 ms

静态获取检测到空白/Bot 画面时自动升级为 Stealth Chromium 并提取 Markdown

POST /transit/route (换乘指南)

约 390 ms

0.6 〜 7.0 ms

Yahoo! 路线信息抓取(最优路线・IC 票价计算)

POST /search/realtime (X 速报)

约 440 ms

0.6 ms

Yahoo! 实时搜索(X 推文&图片提取)

POST /search/news (新闻)

约 480 ms

0.6 ms

Yahoo! 新闻最新文章搜索

POST /search/image / video

450 〜 550 ms

0.6 ms

Yahoo! 图片・视频搜索

POST /search/chiebukuro (知恵袋)

420 〜 500 ms

0.6 ms

Yahoo! 知恵袋 Q&A 搜索

POST /search/suggest (联想建议)

约 820 ms

0.5 ms

Yahoo! 自动补全相关词补充

POST /browser/action (首次执行)

约 1.4 秒

—

Stealth Chromium 启动+渲染+点击+等待+截图+Markdown 提取

POST /browser/action (会话延续)

约 0.5 〜 0.8 秒

—

在现有标签页(sessionId)上执行追加操作

⚡ 内部增强・AI 优化处理的实测速度 (In-Memory Latency)

不经过外部 LLM API,全部通过 Bun 原生及优化算法在 1 毫秒以内(< 1ms) 完成。

处理・功能

处理时间 (每次实测值)

特点・算法

阅读时间・文字统计计算 (calculateContentStats)

0.03 ms (31 µs)

CJK/英文单词的高速计数&估算阅读时间计算

出处・引用链接提取 (extractCitationsFromMarkdown)

0.06 ms (62 µs)

正则表达式+上下文语境切片

RAG 语义分块 (chunkMarkdownContent)

0.13 ms (138 µs)

考虑标题・代码块边界的语义分割

搜索结果去重・相似排除 (dedupSearchResults)

0.33 ms (335 µs)

50 条的 N-gram Jaccard 相似度判定

PII 个人信息自动脱敏 (maskPiiInText)

0.55 ms (557 µs)

邮箱・电话・Luhn 信用卡判定&替换

超高速 抽取式自动摘要 (TL;DR) (generateExtractiveSummary)

0.97 ms (970 µs)

类似 TF-IDF 的重要句子提取算法

搜索词 Markdown 强调高亮 (highlightMatches)

9.1 ms

通过正则表达式进行语法安全的 <mark> 标签插入


🏛️ 设计思想 (Design Philosophy & Principles)

Sora 基于以下 4 项核心设计原则 构建:

  1. ✂️ 奥卡姆剃刀(Occam's Razor & Zero-Middleware):

    • 「如无必要,勿增实体。满足需求的最简单架构就是最佳架构。」

    • 彻底排除 Redis、PostgreSQL、外部队列、臃肿的微服务群。仅凭「单一容器・单一二进制文件」 即可运行,从每月 800 日元的 VPS 或 Raspberry Pi 到处理数万请求的云端,都能稳定常驻。

  2. 🛡️ 隐身与生还率的帕累托最优(Stealth & Pareto Optimum):

    • 如果只是「0ms 机械式访问」,会立即被对方服务器的 WAF 或 Cloudflare 封禁 IP,成功率将跌至 0%。

    • 对同一域名的连续访问会自动插入 150ms + Jitter(0〜100ms 随机波动),打字操作也会附加 15〜40ms 的人类化延迟。在不损害 AI 感知速度的前提下,优先确保 将数据可靠带回的生还率。

  3. 🔒 基于 Distroless 的强健安全机制(Distroless by Design):

    • 容器内不存在 /bin/sh、bash、curl、apt,因此即使存在未知漏洞,攻击者在原理上也没有夺取 Shell 的空间(RCE: 任意代码执行)。标准配备非 root 执行及严格的 SSRF 阻断。

  4. 🗾 公共开放数据直连・可持续性(Sustainable & Autonomous):

    • 天气预报直接访问气象厅官方开放数据 CDN(jma.go.jp)。通过全国 1,805 个市区町村名称的零毫秒自动解析和 30 分钟 LRU 缓存,在将对端服务器负载降至最低的同时永久自主运行。


1. 快速开始

1.1 容器启动 (Docker / Podman)

从 GitHub Container Registry (GHCR) 一键即可立即启动:

docker run -d \
  --name sora \
  -p 3016:8000 \
  -e API_KEY="your-secret-api-key" \
  -e ENABLED_MODULES="all" \
  ghcr.io/ikenokazuki/sora:latest

1.2 MCP 客户端配置(Claude Desktop / Cursor / Cline / Windsurf 等)

Streamable HTTP 连接(推荐・标准)

在配置文件(例如:claude_desktop_config.json 或 Cursor 的 MCP 设置)中添加以下内容:

{
  "mcpServers": {
    "sora": {
      "url": "http://localhost:3016/mcp",
      "headers": {
        "Authorization": "Bearer your-secret-api-key"
      }
    }
  }
}

SSE 连接(面向旧版 SSE 客户端)

{
  "mcpServers": {
    "sora": {
      "url": "http://localhost:3016/sse",
      "headers": {
        "Authorization": "Bearer your-secret-api-key"
      }
    }
  }
}

(※ 未设置 API 密钥时,可省略 headers)


2. 提供的 MCP 工具列表 (共 16 个工具 / 4 个模块)

Sora 根据用途由 4 个逻辑模块 构成。可通过环境变量 ENABLED_MODULES(默认:all,或 web,browser,yahoo,life)自由自定义启用的类别。

┌──────────────────────────────────────────────────────────────────────────┐
│                         Sora - Modular MCP                               │
├─────────────────┬───────────────────┬──────────────────┬─────────────────┤
│ 🌐 Core Web     │ 🤖 Browser Action │ 🇯🇵 Yahoo Services │ 🗾 Daily Life   │
│ (`web`)         │ (`browser`)       │ (`yahoo`)        │ (`life`)        │
│ ・search_web    │ ・browser_action  │ ・search_image   │ ・search_route  │
│ ・scrape        │   (クリック/入力/ │ ・search_video   │   (乗換案内)    │
│ ・scrape_batch  │    スクショ/JS実行│ ・search_news    │ ・get_weather   │
│ ・search_deep   │    セッション保持)│ ・search_chiebukuro│ (気象庁天気)  │
│ ・map_site      │                   │ ・search_realtime│                 │
│ ・crawl_site    │                   │ ・search_trend   │                 │
│                 │                   │ ・suggest_keywords│                │
└─────────────────┴───────────────────┴──────────────────┴─────────────────┘

🌐 Module 1: Core Web & Crawling (ENABLED_MODULES=web)

Web 搜索与正文抓取、批量并行获取、深度集成搜索、站点地图解析、递归爬取。

工具名

说明

标识属性

主要参数

search_web

执行 Web 搜索,获取搜索结果的标题、摘要片段和 URL。支持域名筛选、排除和日期范围指定。

每个项目带有 source: "web"

- query (string, 必需): 搜索关键词- includeDomains (string[], 可选): 要筛选的域名- excludeDomains (string[], 可选): 要排除的域名- updated (string, 可选): 时间范围 ("all", "day", "week", "year")

scrape

抓取指定 URL 的 Web 页面或 PDF,以 Markdown 格式提取正文。SPA 网站或反爬页面会自动使用 Chromium 渲染。支持 RAG 分块、来源提取、阅读时间、PII 保护、表格 JSON 提取、摘要生成。

source: "web"

- url (string, 必需): 目标 URL / PDF- maxChars (number, 可选): 最大字符数 (默认: 10000)- mode (string, 可选): "auto" (智能自动判断, 默认), "fast" (静态最快), "browser" (Stealth Chromium)- formats (string[], 可选): ["markdown", "html", "rawHtml", "links", "screenshot", "jsonLd", "images", "tables"]- chunkMarkdown (boolean, 可选): 是否进行 RAG 语义分块- chunkSize (number, 可选): 分块字符数参考值 (默认: 1000)- extractCitations (boolean, 可选): 是否提取来源・引用链接列表- validateLinks (boolean, 可选): 是否并行验证链接的可达性和状态- extractSummary (boolean, 可选): 是否生成抽取式自动摘要(TL;DR)- maskPii (boolean, 可选): 是否自动屏蔽邮箱、电话号码、信用卡等个人信息- formatAsPrompt (boolean, 可选): 是否生成 LLM 标准 XML 包装器格式- highlightMatches (boolean, 可选): 是否高亮搜索匹配词- webhookUrl (string, 可选): 完成通知的 Webhook URL- onlyMainContent (boolean, 可选): 是否仅提取文章正文 (默认: true)- selectors (object, 可选): 用于精确定位提取的 CSS 选择器关联数组- clipSelector (string, 可选): 元素裁剪截图用 CSS 选择器- headers / cookies (object/array, 可选): 自定义请求头 / Cookie- removeSelectors (string[], 可选): 要清除的噪声选择器- retries (number, 可选): 重试次数 (0〜3)- proxyUrl (string, 可选): 要经过的代理 URL

scrape_batch

指定多个 Web 页面 URL,在保持域名限流的同时进行高速并行抓取并批量返回。

每个结果带有 source: "web"

- urls (string[], 必需): 抓取目标 URL 数组 (最多 20 个)- concurrency (number, 可选): 并行工作线程数 (默认: 3, 最大: 5)- (支持与 scrape 相同的所有其他选项)

search_deep

Firecrawl / Tavily 兼容的集成深度搜索。一次性获取 Web 搜索+热门网站正文自动抓取+实时搜索。

Web 结果带有 source: "web"X 结果带有 source: "x"

- query (string, 必需): 搜索关键词- limit (number, 可选): 正文获取数量 (默认: 5, 最大: 20)- scrapeContent (boolean, 可选): 是否包含正文 (默认: true)- includeRealtime (boolean, 可选): 是否也包含实时搜索 (默认: true)- formats (string[], 可选): ["markdown", "html", "rawHtml", "links", "screenshot"]- onlyMainContent (boolean, 可选): 是否仅提取文章正文 (默认: true)- extractHighlights (boolean, 可选): 是否从每个页面提取查询相关高亮 (默认: false)- includeDomains / excludeDomains (string[], 可选)- updated (string, 可选): 时间范围 ("all", "day", "week", "year")- proxyUrl (string, 可选): 要经过的代理 URL

map_site

探索指定网站的 sitemap.xml 和内部链接,高速提取站内所有 URL 列表(站点地图)。

-

- url (string, 必需): 目标基础 URL- limit (number, 可选): 获取数量 (默认: 200, 最大: 1000)- includeSubdomains (boolean, 可选)- proxyUrl (string, 可选): 要经过的代理 URL

crawl_site

递归爬取指定 URL 下的页面,批量收集多个页面的正文。

每个结果带有 source: "web"

- url (string, 必需): 爬取起始 URL- maxPages (number, 可选): 最大获取页数 (默认: 10, 最大: 50)- maxDepth (number, 可选): 最大链接深度 (默认: 2)- formats (string[], 可选): ["markdown", "html", "rawHtml", "links", "screenshot"]- webhookUrl (string, 可选): 爬取完成时通知的 Webhook URL- proxyUrl (string, 可选): 要经过的代理 URL


💡 LLM / Agent 集成时的最佳实践 & limit 调整指南

在 Agent 或 RAG 应用中使用 Web 搜索、抓取和爬取时,获取数量(limit)的设置会显著影响延迟和回答质量。

1. 增加获取数量的优点和缺点

项目

优点

缺点/风险

推荐设置

集成深度搜索 (/search)

能够从更广泛的来源全面获取信息。

延迟增加:并行获取10-20个网站时,响应时间会延迟5-15秒。LLM上下文膨胀:传入大量全文会增加Token消耗,并可能淹没关键信息(Lost in the Middle 现象)。

默认 5(最大 20)

站内爬取 (/crawl)

能够全面收集整个文档的知识。

时间和资源消耗:处理时间随页面数量成比例增加。

默认 10(最大 50)

站点地图探索 (/map)

能够瞬间掌握整个站点的结构。

仅处理文本,负载极小。

默认 200(最大 1000)

2. 实现高精度LLM应用的最佳实践

[!TIP] 更有效的方法:

  1. 区分使用摘要和全文:搜索摘要(search_web)本身返回 10-20条 结果以广泛了解概况,而全文抓取目标(search_deep 的 limit)则 限制在排名前3-5条,这是最快且最精确的方法。

  2. 结合使用高亮提取:启用 extractHighlights: true(query 指定)后,结构与邻近感知BM25+引擎(标题上下文继承、短语完全匹配、邻近度评分、KWIC摘要生成)能让LLM专注于阅读与查询最相关的关键段落和句子,而无需阅读整个长页面,从而在防止幻觉的同时,将Token消耗减少70-90%(无需外部LLM,本地运行仅需0.3ms)。

  3. 所有端点通用的元数据 (Firecrawl / Tavily 兼容):从 OGP / JSON-LD / HTML 元标签自动提取 publishedTime(发布日期/更新日期)、author(作者)、siteName(站点名称),并附加到 Frontmatter 和 JSON 响应中。LLM 可以即时判断信息的时效性(事实核查)。

  4. GFM语法高亮语言保持:从 <pre><code class="language-python"> 等标签中准确识别编程语言名称,并在 Markdown 输出时以 ```python 形式重现。

  5. 自动Token压缩与噪声去除:自动清理空链接、无效的 JavaScript 链接、不必要的重复空行(cleanMarkdownTokens),并完全清除 Cookie 同意横幅(OneTrust / Cookiebot 等),始终保持 LLM 上下文的清洁。

  6. robots.txt 站点地图自动发现:从 /robots.txt 自动检测非常规配置的 Sitemap URL,并递归爬取最多 1,000 条 Sitemap Index。

  7. 爬取时的流式传输:爬取多个页面时,利用 POST /crawl/stream(SSE)在每获取一个页面后立即进行流式接收和处理,无需等待所有页面完成即可即时向用户或LLM返回中间响应。

3. 实测基准测试与可扩展性特性(本地实测值)

处理

数量/页数

平均延迟 (ms)

吞吐量

特性/备注

站内爬取 (/crawl)

maxPages: 5(旧默认值)

358 ms

13.9 页/秒

通过3路并行抓取实现极速

maxPages: 10(新默认值)

341 ms

29.3 页/秒

并行队列效率提升,耗时与旧默认值相当

maxPages: 20

2,046 ms

9.8 页/秒

约2秒完成20页全文收集

maxPages: 50(新上限)

4,685 ms

10.7 页/秒

爬取50页也能在5秒内稳定运行

站点地图探索 (/map)

limit: 100(旧默认值)

826 ms

-

仅解析 XML/HTML,极其轻量

limit: 200(新默认值)

882 ms

-

与100条时相比响应时间几乎不变 (+56ms)

limit: 1000(新上限)

808 ms

-

即使探索1,000条,开销也几乎为零

集成深度搜索 (/search)

limit: 3(旧默认值)

约 1.4 秒

-

Web搜索 + 并行抓取前3条结果

limit: 5(新默认值)

约 2.0 〜 3.4 秒

-

Web搜索 + 并行抓取前5条结果

limit: 20(新上限)

约 4 〜 8 秒

-

对广泛来源进行深度调查


🤖 模块 2:浏览器操作与自动化 (ENABLED_MODULES=browser)

支持表单输入、按钮点击、页面滚动、JavaScript 执行、截图拍摄、多轮对话会话。

工具名

说明

识别属性

主要参数

browser_action

打开网页,执行指定的一系列操作序列(点击、文本输入、按键、滚动、等待、截图、JS执行、页面跳转),并返回最终页面的 Markdown 或 Base64 截图。支持通过按钮的“显示文本指定点击”以及通过 sessionId 维持多轮对话会话。

source: "browser"

- url (字符串,可选): 起始/跳转 URL- sessionId (字符串,可选): 现有会话ID- createSession (布尔值,可选): 是否创建并维持会话- closeSession (布尔值,可选): 是否结束会话- actions (数组,可选): 要执行的操作列表 (click, fill, press, select, scroll, wait, evaluate, navigate)- extract (对象,可选): { markdown: true, screenshot: true, html: false }- timeout (数字,可选): 超时时间 ms


🇯🇵 模块 3:Yahoo! JAPAN 服务 (ENABLED_MODULES=yahoo)

完全专注于日本媒体、问答、趋势和实时信息的搜索组。

工具名

说明

识别属性

主要参数

search_image

执行 Yahoo! JAPAN 图片搜索,获取图片标题、图片URL、缩略图、图片尺寸、来源页面。

每个项目带有 source: "image"

- query (字符串,必填): 搜索关键词- limit (数字,可选): 获取数量 (默认: 20, 最大: 50)

search_video

执行 Yahoo! JAPAN 视频搜索,获取视频标题、视频URL、播放时长、发布来源、缩略图。

每个项目带有 source: "video"

- query (字符串,必填): 搜索关键词- limit (数字,可选): 获取数量 (默认: 20, 最大: 50)

search_news

执行 Yahoo! 新闻搜索,获取最新新闻文章的标题、摘要、发布机构、发布日期时间、文章URL。

每个项目带有 source: "news"

- query (字符串,必填): 搜索关键词- limit (数字,可选): 获取数量 (默认: 10, 最大: 50)

search_chiebukuro

执行 Yahoo! 知惠袋 Q&A 搜索,获取问题标题、回答数、解决状态、正文摘要。

每个项目带有 source: "chiebukuro"

- query (字符串,必填): 搜索关键词- limit (数字,可选): 获取数量 (默认: 10, 最大: 50)

suggest_keywords

获取 Yahoo! JAPAN 自动补全建议,返回相关搜索词、补全候选。

source: "suggest"

- query (字符串,必填): 补全关键词- limit (数字,可选): 获取数量 (默认: 10, 最大: 30)

search_realtime

执行 Yahoo! 实时搜索,获取 X(原 Twitter)的最新帖子(发布者、正文、发布时间、媒体、URL)。支持按最新顺序 (recent) 和热门顺序 (popular) 切换。

每个项目带有 source: "x"

- query (字符串,必填): 搜索关键词- sort (字符串,可选): "recent"(最新顺序,默认)或 "popular"(热门顺序)- limit (数字,可选): 获取数量 (默认: 20, 最大: 40)- page (数字,可选): 页码 (默认: 1)

search_trend

获取 Yahoo 实时搜索的最新趋势(飙升关键词排名 20 条)。

每个项目带有 source: "x"

- limit (数字,可选): 获取数量 (默认: 20)


🗾 模块 4:日本日常生活与交通 (ENABLED_MODULES=life)

直接连接日本公共交通和气象厅官方开放数据的生活基础设施功能。

工具名

说明

识别属性

主要参数

search_route

日本国内电车换乘指南。探索车站间的最佳路线、所需时间、换乘次数、IC/纸质车票票价。支持指定途经站(最多3站)、指定日期时间、特急/新干线使用标志。

source: "transit"

- from (字符串,必填): 出发站名 (例「东京」)- to (字符串,必填): 到达站名 (例「新宿」)- via (字符串数组,可选): 途经站 (最多3站)- timeType (字符串,可选): "departure", "arrival", "first_train", "last_train"- ticket (字符串,可选): "ic", "cash"- sortBy (字符串,可选): "time", "transfer", "fare"

get_weather

通过气象厅官方开放数据,获取日本全国各地的今日、明日、后日天气预报、预计气温、降水概率、天气概况、风浪信息。支持自动解析全国 1,805 个市区町村名称。

source: "weather"

- city (字符串,必填): 市区町村名 (例「天童市」「轻井泽」「箱根」「浦安」「东京」) 或 地点ID (例「130010」)- days (数字,可选): 预报天数 (1〜3天,默认: 3)


3. REST API 规范

基础 URL: http://localhost:3016(或部署目标的域名 URL)

3.1 健康检查与指标

GET /health

{
  "status": "ok",
  "service": "sora",
  "cachedEntries": 0,
  "chromiumAvailable": true,
  "yahooMcpAvailable": true,
  "mcpConnected": true,
  "timestamp": "2026-08-21T05:54:26.782Z"
}

GET /metrics(运行统计、缓存命中率、资源使用量)

{
  "status": "ok",
  "service": "sora",
  "uptimeSeconds": 1420,
  "cache": {
    "size": 42,
    "maxSize": 3000,
    "hits": 156,
    "misses": 48,
    "hitRatio": 0.7647
  },
  "activeSessions": 2,
  "chromium": {
    "available": true,
    "sharedConnected": true
  },
  "memory": {
    "rssMb": 86,
    "heapUsedMb": 34,
    "heapTotalMb": 58
  },
  "timestamp": "2026-08-22T04:20:00.000Z"
}

GET /metrics?format=prometheus 或 Accept: text/plain(用于 Prometheus 监控的指标)

以 Grafana / Prometheus 监控栈可直接导入的标准文本格式输出。

# HELP sora_uptime_seconds Process uptime in seconds
# TYPE sora_uptime_seconds gauge
sora_uptime_seconds 1420
# HELP sora_memory_rss_bytes Resident set size in bytes
# TYPE sora_memory_rss_bytes gauge
sora_memory_rss_bytes 90177536
# HELP sora_cache_hits_total Total cache hits
# TYPE sora_cache_hits_total counter
sora_cache_hits_total 156
# HELP sora_cache_hit_rate Cache hit rate
# TYPE sora_cache_hit_rate gauge
sora_cache_hit_rate 0.7647
# HELP sora_active_browser_sessions Active browser sessions count
# TYPE sora_active_browser_sessions gauge
sora_active_browser_sessions 2

3.2 单 URL / PDF 抓取 (POST /scrape)

  • 请求:

{
  "url": "https://example.com/article",
  "maxChars": 30000,
  "mode": "auto",
  "formats": ["markdown", "jsonLd", "images", "links"],
  "onlyMainContent": true,
  "selectors": {
    "productName": "h1.product-title",
    "price": ".price-value",
    "buyLink": "a.btn-buy@href",
    "thumbnail": "img.main-photo@src"
  },
  "extractHighlights": true,
  "query": "新機能 リリース"
}
  • 响应示例:

{
  "url": "https://example.com/article",
  "title": "最新アップデートのお知らせ",
  "content": "---\ntitle: \"最新アップデートのお知らせ\"\nurl: \"https://example.com/article\"\npublishedTime: \"2026-08-22T10:00:00Z\"\nauthor: \"開発チーム\"\nsiteName: \"Tech Blog\"\n---\n\n...",
  "isTruncated": false,
  "contentType": "text/html",
  "source": "web",
  "renderedWithBrowser": false,
  "publishedTime": "2026-08-22T10:00:00Z",
  "author": "開発チーム",
  "siteName": "Tech Blog",
  "extracted": {
    "productName": "Sora プレミアムキーボード",
    "price": "¥24,800",
    "buyLink": "https://example.com/cart/add?id=123",
    "thumbnail": "https://example.com/images/feature.png"
  },
  "jsonLd": [
    {
      "@context": "https://schema.org",
      "@type": "NewsArticle",
      "headline": "最新アップデートのお知らせ"
    }
  ],
  "images": [
    {
      "url": "https://example.com/images/feature.png",
      "alt": "新機能の画面イメージ"
    }
  ],
  "highlights": [
    "本日より新機能の提供を開始いたします。"
  ]
}

[!TIP] 🇯🇵 日文旧版网站自动支持:Shift_JIS (CP932) 或 EUC-JP 编码的网站也能自动判定字符编码并解码。无需担心乱码问题。

📄 PDF 提取增强:多页 PDF 文档会以 <!-- Page 1 -->\n## Page 1 的形式按页码分隔输出为结构化 Markdown,同时自动提取 totalPages 及作者等元数据。

✂️ 语法安全裁剪 & Token 估算:即使通过 maxChars 限制了字符数,也会自动安全地修正并闭合未闭合的代码块(```)或表格。此外,响应中会附带估算的 LLM Token 数 estimatedTokens。

🧩 RAG 优化语义分块 (chunkMarkdown: true):在不破坏标题层级(H1〜H4)、段落或代码块的前提下,自动生成适当分割的 chunks: [{ index, heading, content, estimatedTokens }],可立即用于向量搜索或 RAG。

🖼️ 图片元数据 & 标题提取 (formats: ["images"]):针对每张图片,除 URL 外,还会自动提取 <figcaption> 中的说明文字(caption)、width/height 以及主图判定(isMainImage)。

🔗 页内链接健康度与可达性判定 (validateLinks: true):对页内链接执行轻量级并行验证,返回 HTTP 状态码和有效性 linksWithStatus: [{ url, status, ok }]。

📚 出处・引用链接结构化提取 (extractCitations: true):将正文中的外部链接和参考文献连同上下文语句自动提取为 citations: [{ text, url, context }]。

⏱️ 阅读时间 & 字符・单词数统计:自动计算并附带正文的 characterCount、wordCount,以及根据语言特性估算的阅读时间 readingTimeMin(分钟数)。

🔔 异步 Webhook 回调 (webhookUrl):在长时间批处理或大规模爬取完成时,将结果负载通过 HTTP POST 异步通知到指定端点。

🛡️ PII 自动掩码 (maskPii: true):自动将邮箱地址、日本电话号码、信用卡号(Luhn 校验)等敏感信息替换为 [EMAIL]、[PHONE]、[CREDIT_CARD] 等掩码形式,保护发送至 LLM 的数据安全。

📡 进度实时 SSE 流式推送 (POST /scrape/stream):可通过 Server-Sent Events 实时接收 start → fetch → render → enrich → done 各阶段进度事件。

🎬 YouTube / 视频媒体元数据 & 章节提取 (media):从视频页面自动结构化提取播放时长、缩略图、章节列表(带时间戳的目录)。

🤖 LLM 优化提示词 XML 自动生成 (formatAsPrompt: true):自动生成 Claude / GPT / Gemini 最容易理解的标准 <web_page url="..." title="...">...</web_page> 格式上下文包装器 promptContext。

🖍️ 搜索关键词正文自动高亮 (highlightMatches: true):可将指定 query 的关键词在正文 Markdown 中以 <mark>关键词</mark> 形式高亮显示,并获取 highlightedContent。

📊 表格结构化 JSON 提取 (formats: ["tables"]):可将页面中的表格(<table>)直接获取为 { caption, headers, rows } 结构化 JSON 数组。

⚡ 超高速抽取式自动摘要 (extractSummary: true):无需调用外部 LLM API,通过内部算法在毫秒级内自动生成重要语句(TL;DR 摘要)summary: string[]。

🎯 搜索结果去重 (dedup: true):在新闻搜索或实时搜索中,通过相似度判定自动排除复制粘贴帖或转载文章,仅精选独特信息。

🔄 自动重试策略 (retries & retryDelayMs):在连接失败或 429/503 错误时,以指数退避方式自动重试,提高容错能力。

📸 元素指定截图 (clipSelector):通过指定特定元素(例如:clipSelector: "#stock-chart"),可获取仅裁剪该元素的 Base64 PNG 图片。

🍪 自定义请求头 & Cookie 注入 (headers / cookies):可透明发送会员网站、语言指定(Accept-Language)、年龄验证 Cookie 等。

🧹 用户指定噪声选择器移除 (removeSelectors):指定 removeSelectors: [".ad", ".comments", "#related-articles"],可在 Markdown 转换前彻底清除特定区块。

📖 交互式 API 文档 (GET /docs):从浏览器访问 http://localhost:3016/docs,即可通过 Swagger UI 直接测试执行(Try it out)所有 API。


3.2.1 多 URL 批量并行抓取 (POST /scrape/batch)

指定多个网页 URL,在保持按域名限流的同时,在服务器端高速并行抓取并批量获取。

  • 请求 (POST):

{
  "urls": [
    "https://example.com/page1",
    "https://example.com/page2",
    "https://example.com/page3"
  ],
  "concurrency": 3,
  "maxChars": 10000,
  "mode": "auto",
  "formats": ["markdown", "jsonLd"]
}
  • 响应示例:

{
  "total": 3,
  "successful": 3,
  "failed": 0,
  "results": [
    {
      "url": "https://example.com/page1",
      "title": "Page 1 Title",
      "content": "...",
      "estimatedTokens": 450
    }
  ],
  "errors": []
}

3.3 交互式浏览器自动操作 (POST /browser/action 或 POST /action)

打开网页后,依次执行点击、文本输入、滚动、等待、截图等一系列操作,并获取最终结果。同时支持一次性执行和在聊天中交互式操作的有状态多轮对话会话 (sessionId)。

① 一次性执行(单次完成)

  • 请求 (POST):

{
  "url": "https://example.com/search",
  "actions": [
    { "type": "fill", "selector": "input[name='q']", "text": "Sora" },
    { "type": "click", "text": "検索" },
    { "type": "wait", "selector": ".results-container", "ms": 5000 },
    { "type": "scroll", "direction": "down", "distance": 1000 }
  ],
  "extract": {
    "markdown": true,
    "screenshot": true,
    "html": false
  },
  "timeout": 30000
}
  • 响应示例:

{
  "source": "browser",
  "url": "https://example.com/search?q=Sora",
  "title": "検索結果 - Sora",
  "content": "---\ntitle: \"検索結果 - Sora\"\nurl: \"https://example.com/search?q=Sora\"\n---\n\n# 検索結果\n...",
  "screenshot": "iVBORw0KGgoAAAANSUhEUgA...",
  "actionLogs": [
    { "step": 1, "type": "fill", "target": "input[name='q']", "success": true, "elapsedMs": 42 },
    { "step": 2, "type": "click", "target": "検索", "success": true, "elapsedMs": 115 },
    { "step": 3, "type": "wait", "target": ".results-container", "success": true, "elapsedMs": 620 },
    { "step": 4, "type": "scroll", "target": undefined, "success": true, "elapsedMs": 510 }
  ],
  "renderedWithBrowser": true
}

② 有状态多轮对话会话(面向交互式聊天)

  • 第 1 轮(创建会话 & 打开页面):

{
  "url": "https://example.com/login",
  "createSession": true,
  "actions": [
    { "type": "fill", "selector": "#username", "text": "myuser" }
  ],
  "extract": { "screenshot": true }
}

(响应中会返回 "sessionId": "sess_a1b2c3d4")

  • 第 2 轮(在已打开的页面中继续操作):

{
  "sessionId": "sess_a1b2c3d4",
  "actions": [
    { "type": "fill", "selector": "#password", "text": "mypassword" },
    { "type": "click", "text": "ログイン" },
    { "type": "wait", "selector": "#dashboard" }
  ],
  "extract": { "markdown": true }
}
  • 第 3 轮(结束会话 & 清理资源):

{
  "sessionId": "sess_a1b2c3d4",
  "closeSession": true
}

(※ 如果操作中断超过 5 分钟,也会通过自动超时安全释放内存)


3.4 集成深度搜索 (POST /search) & Web 搜索 (POST /search/web)

  • 深度搜索请求 (POST /search):

{
  "query": "2026年 AI 最新トレンド",
  "limit": 5,
  "scrapeContent": true,
  "includeRealtime": true,
  "updated": "week",
  "formats": ["markdown"]
}
  • 以 HTML 格式获取时:

{
  "query": "React 19 新機能",
  "formats": ["html"]
}
  • 仅提取重要高亮时(Token 节省模式):

{
  "query": "React 19 新機能 変更点",
  "extractHighlights": true
}
  • Web 搜索请求 (POST /search/web):

{
  "query": "新商品 発売情報",
  "includeDomains": ["example.com", "news.example.org"],
  "excludeDomains": ["spam.example.com"],
  "updated": "week"
}

3.4.1 站点地图探索 (POST /map)

探索指定域名的 sitemap.xml 或内部链接,提取站点内的全部 URL 列表。

  • 请求:

{
  "url": "https://example.com",
  "limit": 200,
  "includeSubdomains": false
}

3.4.2 子页面递归爬取 (POST /crawl & POST /crawl/stream)

从指定 URL 开始递归遍历下级页面,批量收集多个页面的 Markdown/HTML/图片/结构化数据。支持通过 includePatterns / excludePatterns 进行 Glob 通配符过滤。

  • 请求(批量获取):

{
  "url": "https://example.com/docs",
  "maxPages": 20,
  "maxDepth": 2,
  "includePatterns": ["/docs/**", "/guide/*"],
  "excludePatterns": ["/tag/**", "*.pdf"],
  "formats": ["markdown", "jsonLd", "images"]
}
  • SSE 流式推送 (POST /crawl/stream):每获取一个页面,即通过 Server-Sent Events 实时推送(start -> page -> done)。


3.5 图片・视频・新闻・知惠袋・联想搜索

  • 图片搜索 (POST /search/image):{ "query": "富士山", "limit": 10 }

  • 视频搜索 (POST /search/video):{ "query": "简单 菜谱", "limit": 10 }

  • 新闻搜索 (POST /search/news):{ "query": "AI 机器人", "limit": 10 }

  • 知惠袋 Q&A (POST /search/chiebukuro):{ "query": "编程 初学者", "limit": 10, "status": "solved" }

  • 关键词补全 (POST /search/suggest):{ "query": "天气", "limit": 10 }


3.6 电车换乘指南 (POST /transit/route)

  • 请求:

{
  "from": "東京",
  "to": "新宿",
  "sortBy": "time"
}
  • 响应示例:

{
  "source": "transit",
  "from": "東京",
  "to": "新宿",
  "count": 3,
  "routes": [
    {
      "rank": 1,
      "summary": {
        "departureTime": "09:30",
        "arrivalTime": "09:44",
        "durationMinutes": 14,
        "transferCount": 0,
        "fare": {
          "ic": 209,
          "ticket": 210
        },
        "flags": {
          "isFastest": true,
          "isCheapest": true,
          "isEasiest": true
        }
      },
      "sections": [
        {
          "type": "move",
          "line": "JR中央線快速・高尾行",
          "from": "東京",
          "departureTime": "09:30",
          "to": "新宿",
          "arrivalTime": "09:44"
        }
      ]
    }
  ]
}

3.7 日本全国 天气预报 (POST /weather / GET /weather / GET /weather/:city)

直接解析日本气象厅官方开放数据 API(以及 livedoor 天气兼容格式),完全自主获取日本全国今天・明天・后天的详细气象数据。

本功能优势 (Features & Advantages)

  • 完全自主・官方直连(零依赖):直接从气象厅官方 CDN(jma.go.jp)获取并解析气象数据。

  • 全国 1,805 个市区町村的智能自动解析:内置气象厅官方区域定义(area.json)。可从「天童市」「轻井泽」「箱根」「浦安」「别府」等市区町村名或知名地名,以 0ms 速度自动选定负责的气象台地点 ID。也支持不带县名的输入。

  • AI 智能体友好的结构化数据:一次性获取 3 天的天气播报、风・浪、预计最高/最低气温(℃)、分时段降水概率(0-6时, 6-12时, 12-18时, 18-24时)、气象台发布的天气概况文(标题・正文)等干净 JSON 数据。

  • LRU 缓存实现超高速响应:标准内置 30 分钟内存 LRU 缓存,自动防止对气象厅服务器的不必要重复访问。

  • 请求 (POST):

{
  "city": "天童市",
  "days": 3
}
  • GET 请求:GET /weather?city=轻井泽&days=2 或 GET /weather/箱根

  • 响应示例:

{
  "source": "weather",
  "cityId": "060010",
  "title": "村山 の天気",
  "publishedTime": "2026-08-21T17:00:00+09:00",
  "publicTime": "2026-08-21T17:00:00+09:00",
  "publishingOffice": "山形地方気象台",
  "location": {
    "area": "東北",
    "prefecture": "山形県",
    "city": "天童市"
  },
  "overview": "前線が、日本海から東北地方を通って、日本の東にのびています。村山地方では、夜遅くにかけて雷を伴い激しい雨が降る所がある見込みです。",
  "description": {
    "headline": "",
    "body": "前線が、日本海から東北地方を通って、日本の東にのびています...",
    "text": "..."
  },
  "forecasts": [
    {
      "date": "2026-08-21",
      "dateLabel": "今日",
      "telop": "曇り",
      "detail": {
        "weather": "くもり 所により 夕方 雨 で 雷を伴い 激しく 降る",
        "wind": "北の風 後 南東の風",
        "wave": null
      },
      "temperature": {
        "min": "22℃",
        "max": "31℃"
      },
      "chanceOfRain": {
        "T00_06": "30%",
        "T06_12": "0%",
        "T12_18": "0%",
        "T18_24": "30%"
      },
      "image": "https://www.jma.go.jp/bosai/forecast/img/200.svg"
    }
  ]
}

3.8 Yahoo 实时搜索 & 趋势 (POST /search/realtime / POST /search/trend)

  • 实时搜索 (POST /search/realtime):{ "query": "活动名称", "sort": "popular", "limit": 20, "page": 1 }

    • sort:"recent"(按最新排序,默认)或 "popular"(按热门排序 / 按互动量排序)

    • 每条帖子会自动附带统一格式的 publishedTime(ISO 8601 字符串)、author(用户名 + @账号名)、siteName: "X (Twitter)"。

  • 飙升趋势 (POST /search/trend):{ "limit": 20 }


3.9 站点地图 & 爬取 (POST /map / POST /crawl)

  • 站点地图 (POST /map):{ "url": "https://example.com", "limit": 200 }

  • 递归爬取 (POST /crawl):{ "url": "https://example.com/docs", "maxPages": 10 }


4. 安全 & 架构

4.1 Distroless 容器设计

  • 基础镜像:gcr.io/distroless/cc-debian12

  • 无 Shell・无包管理器:容器内不存在 /bin/sh、apt、curl 等任何组件,攻击者没有夺取 Shell 的余地。

  • 最小权限设计:支持非 root 运行,可在 Docker / Podman / Kubernetes 等标准容器环境中安全隔离运行。

4.2 安全 & 性能功能

  • 🛡️ 多重 SSRF & DNS Rebinding 防御:

    • 阻断对私有 IP(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8 等)、CGNAT(100.64.0.0/10)、IPv6 特殊地址、云元数据 IP(169.254.169.254)的内部访问。

    • 通过 dns.promises.lookup 进行预先名称解析,在连接前即时阻断利用域名伪装发起的 DNS Rebinding 攻击。

  • ⚡ Single-Flight 缓存(请求中去重):

    • 当同一 URL 出现并发请求时,共享 Promise 并聚合为一次外部通信。防止惊群效应(缓存雪崩),保护外部服务器和本地资源。

  • 🚦 浏览器并发限制 (Concurrency Control):

    • 通过 SimpleSemaphore 安全控制 Chromium 进程的并发数量(MAX_CONCURRENT_BROWSERS,默认 5)。防止服务器 CPU/内存耗尽。

  • 🔒 时间安全认证 & 浏览器会话所有权绑定:

    • API 密钥比对采用 crypto.timingSafeEqual + SHA-256(常数时间比较),防御时序攻击。

    • 将多轮浏览器会话(sessionId)与创建者令牌进行密码学绑定,防止他人劫持会话。

  • 🛡️ 任意 JavaScript 执行的安全控制开关 (ALLOW_BROWSER_EVALUATE):

    • 通过环境变量 ALLOW_BROWSER_EVALUATE=false 或 SAFE_BROWSER_MODE=true,可立即禁用并锁定 /browser/action 中的 evaluate 脚本执行。

  • 📐 统一 Zod 模式 & OpenAPI 3.0 完全自动生成:

    • REST / MCP 双方统一使用 Zod 模式进行输入验证。

    • /openapi.json 从代码侧的 Zod 模式 100% 动态自动生成 OpenAPI 3.0 规范,完全防止文档偏差。

    • 错误响应采用 { "error": "...", "code": "SSRF_BLOCKED", "status": 403, "retryable": false } 等结构,便于 AI 智能体自我修复和自主判断。

  • ⏱️ Jitter 限流 & 真正的 LRU 缓存:

    • 对同一域名的过度连续访问,以 150ms + Jitter(0〜100ms 随机波动)自动抑制。

    • 通过 15〜30 分钟的真正 LRU(访问时更新)缓存和每 10 分钟一次的定期 TTL 清理,完全防止内存泄漏。


5. 致谢・鸣谢 (Acknowledgments)

Sora 的诞生离不开以下优秀的开源项目、公开服务、公共开放数据以及各库作者的卓越贡献。在此致以最诚挚的感谢。

🗾 数据来源 & 灵感来源 (Data Sources & Inspirations)

  • 日本气象厅(JMA)开放数据:jma.go.jp

    • 衷心感谢其公开提供日本全国高精度气象预报・防灾数据以及全国 1,800 多个区域定义数据。

  • 天气预报 API(livedoor 天气兼容)设计灵感:tsukumijima/weather-api / weather.tsukumijima.net

    • 感谢其 livedoor 天气兼容格式的清晰模式设计以及多年来的社区贡献。

  • Yahoo Japan Search MCP:mouseos/Yahoo-Japan-Search-MCP

    • 感谢其 Yahoo! JAPAN 图片・视频・新闻・知惠袋・联想搜索的 MCP 实现。

  • norikae-mcp:tysonwu/norikae-mcp

    • 感谢其基于 Yahoo! 路线信息抓取的换乘指南逻辑的设计与实现。

🛠️ 基础开源・库 (Core Libraries & Ecosystem)


6. 免责声明 (Disclaimer)

  • 非官方第三方工具:

    • 本软件是为个人开发、学术研究、企业内部使用而开发的非官方(第三方)工具。

  • 关于商标:

    • 「Yahoo!」「Yahoo! JAPAN」及各服务名称均为 LINE Yahoo 株式会社的商标或注册商标。本项目与 LINE Yahoo 株式会社无任何关联。

  • 遵守使用条款・法律法规:

    • 在访问各外部服务(Yahoo! JAPAN、日本气象厅等)时,请遵守对方服务的使用条款、指南、robots.txt 以及适用法律法规,并由使用者自行负责,避免造成过度负载。

  • 责任限制:

    • 因使用本软件而产生的任何损害(包括对方服务的访问限制、数据的完整性・准确性・时效性等),本项目开发者概不负责。


7. 许可证 (License)

本软件根据 Business Source License 1.1 (BSL 1.1 / BUSL-1.1) 发布。

  • 可自由・免费使用的用途:

    • 个人开发、学术研究、非商业用途

    • 企业・组织内部面向自有系统的自托管使用(作为支撑自有产品或内部工具的内部后端运行)

    • 源代码的修改・分叉・内部共享

  • 禁止事项 (Restriction):

    • 将本软件(或其衍生作品)作为面向第三方的「付费云服务」「付费抓取 / 搜索 API 服务」「托管服务」提供或转售。

  • Change Date(开源转换日期):

    • 2030年8月1日(或更早)将自动转换为完整的 MIT License。

详情请参阅 LICENSE。

Copyright (c) 2026 ikeno

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Production-ready MCP server for AI agents — web search, content extraction, screenshots, weather, finance, email validation, translation, and IP geolocation.
    11 npm
    6
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A comprehensive MCP server providing 15 web tools including search, scraping, screenshots, SEO audits, and DNS/SSL checks through a single installation. It delivers clean, LLM-optimized outputs so AI agents can focus on reasoning rather than parsing raw HTML.
    15
    17 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An APAC-native web scraping API for AI agents that provides tools for scraping, crawling, searching, and extracting structured data from websites, directly usable from MCP-compatible clients like Claude Desktop, Cursor, and Windsurf.
    7
    9 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP tool server that gives any AI agent the ability to search, scrape, and analyze content across the internet.
    42
    MIT