oassis — web scraping, crawling and browser control for AI agents

Scrape to markdown, map and crawl sites, drive a real browser. Pay per call, no API key, no signup.

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
94%
이름 품질
80%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~2,728토큰 (도구 정의)
~2.1 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 2.13%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "scraper-crawler": {
      "url": "https://api.oassis.dev/mcp"
    }
  }
}

원격 엔드포인트

https://api.oassis.dev/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (11)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
⚪web_scrape(url, maxAge, formats, selectors, json, ...)

Processes a page and returns every output you ask for at once: markdown, html, links, screenshot, PDF, accessibility tree, elements by selector, AI-structured data, and `controls` (what can be clicked). One call, and a partial failure does not void the rest. From $0.001 per output. A url pointing at a PDF, Word, Excel or CSV file is converted to markdown instead, with no browser, for $0.002.

입력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Page to process."
    },
    "maxAge": {
      "type": "number",
      "description": "Accept an answer up to this many milliseconds old. A cache hit costs $0.0002 instead of the format price. Leave it out to force a fresh render."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "html",
          "markdown",
          "links",
          "screenshot",
          "pdf",
          "elements",
          "json",
          "accessibility",
          "controls"
        ]
      },
      "description": "Outputs you want in the same response. `controls` is the map of what can be clicked; `elements` needs `selectors`; `json` needs `json.prompt`."
    },
    "selectors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "CSS selectors for `elements`."
    },
    "json": {
      "type": "object",
      "description": "For the `json` format: `prompt` and/or `schema`.",
      "properties": {
        "prompt": {
          "type": "string"
        },
        "schema": {
          "type": "object"
        }
      }
    },
    "wait": {
      "type": "object",
      "description": "When to consider the page loaded: `until`, `selector`, `timeout`.",
      "properties": {
        "until": {
          "type": "string",
          "enum": [
            "load",
            "domcontentloaded",
            "networkidle0",
            "networkidle2"
          ]
        },
        "selector": {
          "type": "string"
        },
        "timeout": {
          "type": "number"
        }
      }
    },
    "html": {
      "type": "string",
      "description": "Raw HTML instead of `url`."
    }
  },
  "required": []
}
⚪web_session_open(url, maxAge, formats, selectors, json, ...)

Opens a browser on a page and leaves it open, returning the map of controls. Use it when something has to be FILLED IN or CLICKED, not just read: inside the session the `controls` references keep working and you can act on the same state. $0.005 plus the outputs. Close it with web_session_close when you are done.

입력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Page to process."
    },
    "maxAge": {
      "type": "number",
      "description": "Accept an answer up to this many milliseconds old. A cache hit costs $0.0002 instead of the format price. Leave it out to force a fresh render."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "html",
          "markdown",
          "links",
          "screenshot",
          "pdf",
          "elements",
          "json",
          "accessibility",
          "controls"
        ]
      },
      "description": "Outputs you want in the same response. `controls` is the map of what can be clicked; `elements` needs `selectors`; `json` needs `json.prompt`."
    },
    "selectors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "CSS selectors for `elements`."
    },
    "json": {
      "type": "object",
      "description": "For the `json` format: `prompt` and/or `schema`.",
      "properties": {
        "prompt": {
          "type": "string"
        },
        "schema": {
          "type": "object"
        }
      }
    },
    "wait": {
      "type": "object",
      "description": "When to consider the page loaded: `until`, `selector`, `timeout`.",
      "properties": {
        "until": {
          "type": "string",
          "enum": [
            "load",
            "domcontentloaded",
            "networkidle0",
            "networkidle2"
          ]
        },
        "selector": {
          "type": "string"
        },
        "timeout": {
          "type": "number"
        }
      }
    }
  },
  "required": [
    "url"
  ]
}
⚪web_act(sessionId, actions, url, maxAge, formats, ...)

Runs actions against an open session and returns the resulting state. Actions: {navigate}, {click:{ref}}, {type:{ref,text,clear}}, {select:{ref,value}}, {press}, {scroll}, {wait}, {back}. The `ref` is the one `controls` gave you. It stops at the first failure and tells you where. $0.0005 per action.

입력 스키마

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "The one web_session_open returned."
    },
    "actions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Actions, in order."
    },
    "url": {
      "type": "string",
      "description": "Page to process."
    },
    "maxAge": {
      "type": "number",
      "description": "Accept an answer up to this many milliseconds old. A cache hit costs $0.0002 instead of the format price. Leave it out to force a fresh render."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "html",
          "markdown",
          "links",
          "screenshot",
          "pdf",
          "elements",
          "json",
          "accessibility",
          "controls"
        ]
      },
      "description": "Outputs you want in the same response. `controls` is the map of what can be clicked; `elements` needs `selectors`; `json` needs `json.prompt`."
    },
    "selectors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "CSS selectors for `elements`."
    },
    "json": {
      "type": "object",
      "description": "For the `json` format: `prompt` and/or `schema`.",
      "properties": {
        "prompt": {
          "type": "string"
        },
        "schema": {
          "type": "object"
        }
      }
    },
    "wait": {
      "type": "object",
      "description": "When to consider the page loaded: `until`, `selector`, `timeout`.",
      "properties": {
        "until": {
          "type": "string",
          "enum": [
            "load",
            "domcontentloaded",
            "networkidle0",
            "networkidle2"
          ]
        },
        "selector": {
          "type": "string"
        },
        "timeout": {
          "type": "number"
        }
      }
    }
  },
  "required": [
    "sessionId",
    "actions"
  ]
}
🟢web_scrape_batch(urls, formats, selectors, json, wait, ...)

A batch OF SCRAPES: reads a list of urls YOU give it (2 to 50, from any sites) and returns a jobId. It discovers nothing on its own — for that use web_crawl. Charged up front per url; urls that fail and urls served from the cache are refunded. Poll it with web_batch_status.

입력 스키마

{
  "type": "object",
  "properties": {
    "urls": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The urls to read, 2 to 50. They do not have to share a site."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "html",
          "markdown",
          "links",
          "screenshot",
          "pdf",
          "elements",
          "json",
          "accessibility",
          "controls"
        ]
      },
      "description": "Outputs you want in the same response. `controls` is the map of what can be clicked; `elements` needs `selectors`; `json` needs `json.prompt`."
    },
    "selectors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "CSS selectors for `elements`."
    },
    "json": {
      "type": "object",
      "description": "For the `json` format: `prompt` and/or `schema`.",
      "properties": {
        "prompt": {
          "type": "string"
        },
        "schema": {
          "type": "object"
        }
      }
    },
    "wait": {
      "type": "object",
      "description": "When to consider the page loaded: `until`, `selector`, `timeout`.",
      "properties": {
        "until": {
          "type": "string",
          "enum": [
            "load",
            "domcontentloaded",
            "networkidle0",
            "networkidle2"
          ]
        },
        "selector": {
          "type": "string"
        },
        "timeout": {
          "type": "number"
        }
      }
    },
    "maxAge": {
      "type": "number",
      "description": "Accept an answer up to this many milliseconds old. A cache hit costs $0.0002 instead of the format price. Leave it out to force a fresh render."
    }
  },
  "required": [
    "urls"
  ]
}
🟢web_batch_status(jobId, limit, cancel)

Checks a batch of scrapes: status, how many are done, and the results. Free. Pass `cancel: true` to stop it and get the urls it never read refunded.

입력 스키마

{
  "type": "object",
  "properties": {
    "jobId": {
      "type": "string"
    },
    "limit": {
      "type": "number",
      "description": "Results to return (default 50)."
    },
    "cancel": {
      "type": "boolean",
      "description": "Stop the batch and refund what it did not read."
    }
  },
  "required": [
    "jobId"
  ]
}
⚪web_map(url, limit, includePage, search, includeSubdomains, ...)

Every url of a site, fast and cheap: its sitemap plus, optionally, the links on the page. Use it BEFORE crawling, to see what is there and decide what is worth reading. $0.0003 with `includePage: false` (no browser at all), $0.0015 with the page.

입력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The site to map."
    },
    "limit": {
      "type": "number",
      "description": "Urls to return (default 1000, max 5000)."
    },
    "includePage": {
      "type": "boolean",
      "description": "Render the page too (default true)."
    },
    "search": {
      "type": "string",
      "description": "Keep only urls containing this text."
    },
    "includeSubdomains": {
      "type": "boolean"
    },
    "includePaths": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "excludePaths": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "url"
  ]
}
🟢web_crawl(url, limit, maxDepth, formats, includeSubdomains, ...)

Follows a site's links and reads every page. Returns a jobId; poll it with web_crawl_status. Charged up front for the pages it is allowed to read (`limit`), and the pages it never reads are refunded. Use web_map first if you only need the urls.

입력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Where to start."
    },
    "limit": {
      "type": "number",
      "description": "Pages it may read (default 25, max 200)."
    },
    "maxDepth": {
      "type": "number",
      "description": "How far to follow links (default 2, max 5)."
    },
    "formats": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "html",
          "markdown",
          "links",
          "screenshot",
          "pdf",
          "elements",
          "json",
          "accessibility",
          "controls"
        ]
      },
      "description": "Outputs you want in the same response. `controls` is the map of what can be clicked; `elements` needs `selectors`; `json` needs `json.prompt`."
    },
    "includeSubdomains": {
      "type": "boolean"
    },
    "includePaths": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "excludePaths": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "maxAge": {
      "type": "number",
      "description": "Accept an answer up to this many milliseconds old. A cache hit costs $0.0002 instead of the format price. Leave it out to force a fresh render."
    }
  },
  "required": [
    "url"
  ]
}
🟢web_crawl_status(jobId, limit, cancel)

Checks a crawl: status, pages read, discovered and still queued, and the pages themselves. Free. Pass `cancel: true` to stop it and get the unread pages refunded.

입력 스키마

{
  "type": "object",
  "properties": {
    "jobId": {
      "type": "string"
    },
    "limit": {
      "type": "number",
      "description": "Pages to return (default 50)."
    },
    "cancel": {
      "type": "boolean",
      "description": "Stop the crawl and refund what it did not read."
    }
  },
  "required": [
    "jobId"
  ]
}
🟢web_search_exa(query, limit, snippets, domains, excludeDomains, ...)

Search the web with Exa's index: a query instead of a url, for when you do not know where to look. Returns title, url and a snippet per result. To read the pages, pass the urls to web_scrape_batch. The engine is named because the price is Exa's, passed through with no markup and read from its own payment challenge on every call — today $0.007 per search.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "What to search for."
    },
    "limit": {
      "type": "number",
      "description": "Results (default 10, max 50)."
    },
    "snippets": {
      "type": "boolean",
      "description": "Text alongside each result (default true)."
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Only these domains."
    },
    "excludeDomains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Never these domains."
    },
    "since": {
      "type": "string",
      "description": "Only results published after this ISO date."
    }
  },
  "required": [
    "query"
  ]
}
🟢web_feedback(verdict, route, reference, url, comment)

Tell us an answer was good or bad. FREE. Use it when a result is wrong — empty markdown, a control map missing a button, data that does not match the page — with the url or the jobId so it can be reproduced. It is the only way we learn that we read a page badly: our logs cannot tell that apart from a page that is simply like that.

입력 스키마

{
  "type": "object",
  "properties": {
    "verdict": {
      "type": "string",
      "enum": [
        "good",
        "bad"
      ]
    },
    "route": {
      "type": "string",
      "description": "Which tool or endpoint it is about."
    },
    "reference": {
      "type": "string",
      "description": "The jobId or sessionId it happened on."
    },
    "url": {
      "type": "string",
      "description": "The page that came out wrong."
    },
    "comment": {
      "type": "string",
      "description": "What you expected and what you got."
    }
  },
  "required": [
    "verdict"
  ]
}
⚪web_session_close(sessionId)

Closes a session and stops billing browser time. Free. If you do not close it, it closes itself after a minute without use.

입력 스키마

{
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string"
    }
  },
  "required": [
    "sessionId"
  ]
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 11개