Skip to main content
Glama
rajurayhan

sulus-web-mcp

by rajurayhan

sulus-web-mcp

실시간 웹 조사를 위한 무상태 Playwright MCP 서버입니다. 에이전트는 browse_page, extract_links, search_page — 세 가지 도구를 사용할 수 있으며, 각 도구는 URL을 열고 텍스트를 추출한 뒤 브라우저 컨텨스트를 닫습니다. 클릭/타이핑/로그인 도구는 없습니다.

Sulus Agents(ai-phone-system MCP 커넥터)와 나머지 생태계(Cursor, MCPConnect)를 위해 제작되었습니다. Laravel은 프로세스 내에서 Chromium을 실행할 수 없습니다. 이 서비스는 해당 에이전트들이 호추하는 HTTP MCP입니다.

도구

도구

사욕하는 우

반환 내역

browse_page

공개 페이지의 콘텐츠가 필할 때

제목, 최종 URL, 정리된 마크다운(다른 링크/제목만)

extract_links

외부로 향하는 링크가 필할 때

href + 텍스트의 마크다운 목록

search_page

리와 일치하는 발Т문이 필할 때

리 관련 최대 N개 스니펫

각 호출은 독립적으로 처리됩니다(탐색 + 추출). 이는 ai-phone-system 커넄터 클라이언트가 MCP 세션 없이 tools/list / tools/call을 POST하는 방식과 일치합니다.

Related MCP server: mcp-playwright

요구 사항

  • Node.js 20+

  • Playwright Chromium(npm install 후 npx playwright install chromium)

설정

cd /Users/macbook/Workshop/Sulus.ai/sulus-web-mcp
npm install
npx playwright install chromium
cp .env.example .env
# set MCP_SHARED_SECRET
npm run build

HTTP (Agents, 팀, 프로덕션)

npm run start:http
# or: npm run dev:http

상태 확인: GET /health
MCP: POST /mcp (JSON-RPC, Streamable HTTP)

변수

설명

MCP_SHARED_SECRET

/mcp에 필요한 Bearer 토큰

MCP_HOST / MCP_PORT / MCP_PATH

바인딩 주소 (기본 0.0.0.0:3000/mcp)

MCP_ALLOWED_HOSTS

허용된 Host 헤더 값

ALLOW_INSECURE_HTTP

로컬 http\:// 테스트에서만 true로 설정

ALLOW_HOSTS / DENY_HOSTS

선택적 호스트 목록

NAVIGATION_TIMEOUT_MS

기본 25000 (Agents의 60초 도구 타임아웃 아래로 유지)

BROWSER_MAX_CONCURRENT

기본 3

RATE_LIMIT_PER_MINUTE

Bearer 토큰당 기본 30

MAX_OUTPUT_CHARS

기본 18000 (Agents는 20k에서 잘라냅니다)

로그는 브라우즈(browse)마다 JSON 한 줄로 기록됩니다(url 출처+경로, 상태, ms). 페이지 본문은 절대로 로그에 남지 않습니다.

Docker

cp .env.example .env
docker compose up -d --build

공식 Playwright 이미지(Chromium 포함)를 사용합니다. shm_size: 1gb가 필요합니다.

stdio (로컬 Cursor)

npm run start

.cursor/mcp.json:

{
  "mcpServers": {
    "sulus-web": {
      "command": "node",
      "args": ["dist/index.js"],
      "cwd": "/Users/macbook/Workshop/Sulus.ai/sulus-web-mcp"
    }
  }
}

Cursor에서 HTTP(배포 후):

{
  "mcpServers": {
    "sulus-web": {
      "url": "https://browse.sulus.ai/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_SHARED_SECRET"
      }
    }
  }
}

ai-phone-system Agents에서 연결

  1. 이 서비스를 HTTPS 뒤에 배포합니다.

  2. MCP Connectors에서 커스텀 서버를 추가합니다:

    • URL: https://browse.sulus.ai/mcp

    • 인증: Bearer, 토큰 = MCP_SHARED_SECRET

  3. 에이전트에서 커넥터를 활성화합니다.

HTTP 핸들러는 tools/list 및 tools/call에 initialize / Mcp-Session-Id 없이 응답하며, 이는 ExternalMcpClientService가 보내는 형식입니다. 세션 기반 Streamable HTTP는 Cursor에서도 여전히 작동합니다.

안전

  • HTTPS 전용 (ALLOW_INSECURE_HTTP=true인 경우 제외)

  • localhost, RFC1918, link-local, CGNAT, 클라우드 메타데이터 호스트 차단

  • DNS를 확인하고 사설 주소 응답을 거부합니다

  • 차단된 URL로의 페이지 내 요청을 중단합니다

  • 호출마다 새 브라우저 컨텍스트 — 쿠키 공유 없음

  • 폼 작성 / 클릭 / 파일 업로드 도구 없음

스크립트

npm run typecheck
npm test
npm run build

Available Tools

3 tools
browse_pageA

Use this when you need the content of a live public web page. It opens the URL in a headless browser, waits for the document, and returns the title, final URL, and cleaned markdown (or links/title only). Returns extracted text, not a screenshot. Does not log in or fill forms.

NameRequiredDescriptionDefault
urlYesAbsolute HTTPS URL to open.
waitNoPlaywright waitUntil. Default: domcontentloaded.
extractNoWhat to return. Default: markdown.

TDQS

A4.4/5.0
Behavior5/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 thoroughly explains that it opens a headless browser, waits for the document, returns text (not screenshots), includes the final URL and title, and explicitly states it does not log in or fill forms. This is highly transparent about side effects and limitations.

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 two sentences, front-loaded with the primary use case. Every sentence adds value: the first establishes what and when, the second clarifies output format and exclusions. No wasted words and well-structured for quick parsing.

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

Completeness4/5

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

Given that all parameters are documented in the schema, the output format is explained in the description, and there is no explicit output schema, the description is quite complete. It covers return values, limitations, and waiting behavior. It could mention error handling or rate limits, but these are not critical for this straightforward tool. Minor gaps in edge-case coverage keep it from a 5.

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 coverage is 100%, so the baseline is 3. The description adds minimal parameter-specific detail beyond the schema: it mentions 'cleaned markdown (or links/title only)' which clarifies what extract does, and implies that wait is for waiting. However, it does not provide new syntax or format details beyond the schema's own descriptions, so it stays at the baseline.

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 purpose: retrieving content of a live public web page. It specifies the action (opens in headless browser), the resource, and the output (title, final URL, cleaned markdown). It also distinguishes itself from siblings by noting it returns text not screenshots and doesn't log in or fill forms, making it easy for an agent to differentiate.

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 opens with a clear 'when to use' condition: 'when you need the content of a live public web page.' It also implicitly states when not to use it by saying 'Does not log in or fill forms.' However, it does not explicitly name alternatives like extract_links or search_page, so it lacks explicit exclusion or alternative guidance. Still, the context is clear.

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

search_pageA

Use this when you need excerpts matching a query on a public page. It opens the URL, extracts text, and returns up to N case-insensitive snippets around the query. Returns markdown snippets.

NameRequiredDescriptionDefault
urlYesAbsolute HTTPS URL to open.
queryYesCase-insensitive text to find.
max_matchesNoMax snippets (1–20). Default: 8.
context_charsNoCharacters of context on each side. Default: 160.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden. It discloses the core mechanics (opens URL, extracts text, returns up to N case-insensitive snippets, returns markdown). However, it doesn't disclose failure modes—such as paywalls, JavaScript-rendered pages that yield no text, or redirects—nor timeouts or how empty results are reported. This is adequate but leaves meaningful behavioral gaps.

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?

Two tightly-written sentences, no filler. The usage trigger is front-loaded in the first clause, and the behavioral detail follows efficiently. Every phrase earns its place and the result format is included.

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

Completeness4/5

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

For a search tool with four fully-documented parameters and no output schema, the description covers the essential call contract: purpose, behavior, and return format (markdown snippets). The main omissions—failure behaviors, authentication assumptions, and page-format limits—are secondary for a straightforward public search operation.

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 100%, so per the rubric the baseline is 3. The description adds marginal value beyond the schema: 'case-insensitive' reinforces the query property and 'up to N' maps to max_matches, but these merely echo schema semantics rather than adding new detail. No compensatory burden since coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific, distinct purpose: retrieving query-matching excerpts from a page. It names the resource (public page) and result type (markdown snippets), which clearly separates it from browse_page (full page reading) and extract_links (link harvesting). It earns a 4 but not a 5 because it never explicitly names its siblings to draw the distinction.

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?

'Use this when you need excerpts matching a query on a public page' is an explicit when-to-use statement with a clear triggering condition. The phrase 'public page' implicitly scopes the tool to public content. It doesn't name alternatives or exclusions, but the context is clear enough for an agent to select it correctly.

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.

  1. 3 tool updatesv0.1.0
    • First observedbrowse_page
    • First observedextract_links
    • First observedsearch_page

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: browse_page returns page content, extract_links retrieves outbound links, and search_page provides matching snippets. No ambiguity exists between them despite all operating on URLs.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (browse_page, extract_links, search_page) using snake_case. The pattern is predictable and uniform across the three tools.

Tool Count5/5

Three tools is a well-scoped count for a web browsing server. Each tool handles a distinct aspect (content, links, search) and none are redundant or missing for the core functionality.

Completeness4/5

The tool surface covers the primary browsing capabilities (content extraction, link discovery, and targeted searching). Minor gaps like screenshot capture or form interaction exist, but they are beyond the stated scope and the tools together handle the typical use cases effectively.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables web search across Bing, DuckDuckGo, and Google using Playwright automation, with tools for retrieving search results and extracting page text content.
    20 npm
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Provides browser automation capabilities for LLM applications, enabling web page interaction and data extraction via Playwright.
    12
    41 PyPI
    10
    MIT