Unstract
BLOCKgrade F · trust 46/100LLM-Driven Extraction of Unstructured Data — Built for API Deployments & ETL Pipeline Workflows
ai agentsdata engineeringdocument aigenerative aiidpjson extractionllmmcp serverOverview
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 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{
"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
| Tool | Risk | Description |
|---|---|---|
Engineering | read | team |
deleteEverything | read | |
doThing | read | d |
extractSomething | read | |
probeTool | read |
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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
exec(f"SOCIAL_AUTH_{key} = os.environ.get('{key}')")f"postgresql://{user}:{encoded_password}@{host}:{port}/{db_name}"module = importlib.import_module(module_path)
module = importlib.import_module(module_path)
module = importlib.import_module(module_path)
module = __import__(module_path, fromlist=[class_name])
app.logger.error(f"Authentication failed. bearer token not found {token}")app.logger.error(f"Authentication failed. Invalid bearer token: {token}")callback_url = settings.DJANGO_APP_BACKEND_URL + reverse(
RequestConstants.URL: callback_url,
"http://127.0.0.1:3000",
"could not connect to postgresql://admin:[email protected]:5432/x"
"could not connect to postgresql://admin:s3cr3tpw@db:5432/x",
"postgresql://admin:pw@host:5432/db",
"POSTGRESQL://ADMIN:PW@HOST/DB",
const API_KEY = "phc_PTafesyRuRB5hceRILaNPeyu2IDuzPshyjIPYGvgoBd"; // gitleaks:allow
token = "s3cr3t-webhook-token" # noqa: S105 - not a credential, a canary
.jshintrc
.pre-commit-config.yaml
.last-run.json
.env.test
mod = importlib.import_module(_SPLIT_MIGRATION)
exec(compile(body, str(PERMISSION_MODULE), "exec"), namespace)
exec(compile(body, str(VIEW_MODULE), "exec"), namespace)
exec(compile(body, str(PERMISSION_MODULE), "exec"), namespace)
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
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-09-18 | 054107987385 | BLOCK | F | 46 | first 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