← MCP servers · zipstack

Unstract

BLOCKgrade F · trust 46/100

LLM-Driven Extraction of Unstructured Data — Built for API Deployments & ETL Pipeline Workflows

ai agentsdata engineeringdocument aigenerative aiidpjson extractionllmmcp server

Overview

From the repository's own README, as read at the audited commit.

<div align="center">  <img src="docs/assets/unstract_u_logo.png" style="height: 120px">  <h1>Unstract</h1>  <h2>Turn Unstructured Documents into Structured Data</h2>  <p>    <a href="https://docs.unstract.com">Documentation</a> |    <a href="https://unstract.com/pricing/">Enterprise</a>  </p>  <p>    <a href="LICENSE"><img src="https://img.shields.io/github/license/Zipstack/unstract" alt="License"></a>    <a href="https://docs.unstract.com/unstract/unstract_platform/quick_start"><img src="https://img.shields.io/badge/tutorials-docs-brightgreen" alt="Tutorials"></a>    <a href="https://status.unstract.com"><img src="https://img.shields.io/badge/uptime-status-brightgreen" alt="Uptime Status"></a>    <a href="https://hub.docker.com/u/unstract"><img src="https://img.shields.io/docker/pulls/unstract/backend" alt="Docker Pulls"></a>    <a href="https://deepwiki.com/Zipstack/unstract"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>    <a href="https://cla-assistant.io/Zipstack/unstract"><img src="https://cla-assistant.io/readme/badge/Zipstack/unstract" alt="CLA assistant"></a>  </p>  <p>    <img src="https://img.shields.io/python/required-version-toml?tomlFilePath=https%3A%2F%2Fraw.githubusercontent.com%2FZipstack%2Funstract%2Frefs%2Fheads%2Fmain%2Fpyproject.toml" alt="Python Version from PEP 621 TOML">    <a href="https://github.com/astral-sh/uv"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv"></a>    <a href="https://vite.dev/"><img src="https://img.shields.io/badge/Vite-6.x-646CFF?logo=vite&logoColor=white" alt="Vite"></a>    <a href="https://bun.sh/"><img src="https://img.shields.io/badge/Bun-1.x-000000?logo=bun&logoColor=white" alt="Bun"></a>    <a href="https://biomejs.dev/"><img src="https://img.shields.io/badge/Biome-2.x-60A5FA?logo=biome&logoColor=white" alt="Biome"></a>  </p>  <p>    <a href="https://results.pre-commit.ci/latest/github/Zipstack/unstract/main"><img s

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add ui-e2e --env CACHE_REDIS_PASSWORD=${CACHE_REDIS_PASSWORD} --env CELERY_BACKEND_DB_PASSWORD=${CELERY_BACKEND_DB_PASSWORD} --env CELERY_BROKER_PASS=${CELERY_BROKER_PASS} --env DB_PASSWORD=${DB_PASSWORD} -- npx -y @unstract/ui-e2e
claude-desktop
{
  "mcpServers": {
    "ui-e2e": {
      "command": "npx",
      "args": [
        "-y",
        "@unstract/ui-e2e"
      ],
      "env": {
        "CACHE_REDIS_PASSWORD": "${CACHE_REDIS_PASSWORD}",
        "CELERY_BACKEND_DB_PASSWORD": "${CELERY_BACKEND_DB_PASSWORD}",
        "CELERY_BROKER_PASS": "${CELERY_BROKER_PASS}",
        "DB_PASSWORD": "${DB_PASSWORD}"
      }
    }
  }
}

Exposed tools (5) 5 read · 0 write · 0 destructive

ToolRiskDescription
Engineeringreadteam
deleteEverythingread
doThingreadd
extractSomethingread
probeToolread

Details

Source
zipstack/unstract
npm
@unstract/ui-e2e
PyPI
unstract-x2text-service
Credentials it reads
CACHE_REDIS_PASSWORDCELERY_BACKEND_DB_PASSWORDCELERY_BROKER_PASSDB_PASSWORDDEFAULT_AUTH_PASSWORDDEFAULT_AUTH_USERNAMEDISABLE_SSO_IDP_AUTHORIZATIONGOOGLE_STORAGE_ACCESS_KEY_IDGOOGLE_STORAGE_SECRET_ACCESS_KEYINTERNAL_SERVICE_API_KEYMARIADB_PASSWORDMINIO_ACCESS_KEY_ID
License
AGPL-3.0
Stars
7,244 · pushed 0d ago

Trust audit

Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (10 observation(s))
Network
declared (10 observation(s))
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
backend/backend/settings/base.py:775
exec(f"SOCIAL_AUTH_{key} = os.environ.get('{key}')")
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
unstract/sdk1/src/unstract/sdk1/adapters/vectordb/supabase/src/supabase.py:83
f"postgresql://{user}:{encoded_password}@{host}:{port}/{db_name}"
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
.claude/skills/connector-ops/scripts/verify_connector.py:70
module = importlib.import_module(module_path)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
.claude/skills/connector-ops/scripts/verify_connector.py:107
module = importlib.import_module(module_path)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
.claude/skills/connector-ops/scripts/verify_connector.py:161
module = importlib.import_module(module_path)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
backend/connector_processor/connector_processor.py:30
module = __import__(module_path, fromlist=[class_name])
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
platform-service/src/unstract/platform_service/controller/platform.py:96
app.logger.error(f"Authentication failed. bearer token not found {token}")
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
platform-service/src/unstract/platform_service/controller/platform.py:106
app.logger.error(f"Authentication failed. Invalid bearer token: {token}")
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
backend/pipeline_v2/manager.py:52
callback_url = settings.DJANGO_APP_BACKEND_URL + reverse(
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
backend/pipeline_v2/manager.py:58
RequestConstants.URL: callback_url,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
backend/backend/settings/dev.py:16
"http://127.0.0.1:3000",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/mcp_server/tests/test_redaction.py:42
"could not connect to postgresql://admin:[email protected]:5432/x"
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/mcp_server/tests/test_redaction.py:245
"could not connect to postgresql://admin:s3cr3tpw@db:5432/x",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/mcp_server/tests/test_redaction.py:311
"postgresql://admin:pw@host:5432/db",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backend/mcp_server/tests/test_redaction.py:312
"POSTGRESQL://ADMIN:PW@HOST/DB",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
frontend/src/index.jsx:38
const API_KEY = "phc_PTafesyRuRB5hceRILaNPeyu2IDuzPshyjIPYGvgoBd"; // gitleaks:allow
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
workers/tests/test_notification_terminal_refusal.py:117
token = "s3cr3t-webhook-token"  # noqa: S105 - not a credential, a canary
LOWInventory / provenance · inv.hidden_file · CWE-1104
.jshintrc
.jshintrc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
frontend/test-results/.last-run.json
.last-run.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
workers/.env.test
.env.test
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
backend/dashboard_metrics/tests/test_aggregation_dispatch.py:130
mod = importlib.import_module(_SPLIT_MIGRATION)
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
backend/api_v2/tests/test_api_key_create_target.py:130
exec(compile(body, str(PERMISSION_MODULE), "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
backend/api_v2/tests/test_api_key_create_target.py:349
exec(compile(body, str(VIEW_MODULE), "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
backend/prompt_studio/prompt_studio_registry_v2/tests/test_registry_tool_delete_guards.py:122
exec(compile(body, str(PERMISSION_MODULE), "exec"), namespace)
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table

Gates applied: no_behavioural_pass.

Audited 2026-09-18 · audit v0.4.0 · source sha 054107987385 · full audit: observations/trust-audit/mcp-server/zipstack__unstract.json · Report an issue or request a re-scan

Audit history

DateSourceVerdictGradeScoreChange
2026-09-18054107987385BLOCKF46first audit

Alternatives

Other servers in the same categories, safer ones first.

Questions

What is the Unstract MCP server?

LLM-Driven Extraction of Unstructured Data — Built for API Deployments & ETL Pipeline Workflows

What tools does Unstract expose?

5 in total: 5 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Unstract safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (46/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Unstract need?

It reads CACHE_REDIS_PASSWORD, CELERY_BACKEND_DB_PASSWORD, CELERY_BROKER_PASS, DB_PASSWORD, DEFAULT_AUTH_PASSWORD, DEFAULT_AUTH_USERNAME, DISABLE_SSO_IDP_AUTHORIZATION, GOOGLE_STORAGE_ACCESS_KEY_ID, GOOGLE_STORAGE_SECRET_ACCESS_KEY, INTERNAL_SERVICE_API_KEY, MARIADB_PASSWORD and MINIO_ACCESS_KEY_ID from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (054107987385), read on 2026-09-18. The repository is watched and re-audited when it changes.

Provenance: OBSERVED · read 2026-09-18 · job trust-audit-2026-09-18