Atlas / MCP servers / adeelahmad / lense

lenseBLOCK

mcp/adeelahmad/lense

Lens: intelligence for your agent. Safe, secure and cost-effective. A self-hosted, cited knowledge graph and MCP server for your agents, from a Raspberry Pi to the cloud.

Verdict
BLOCK
Grade
F
Trust score
44 /100
Exposed tools
5 5r · 0w · 0d
Transport
streamable-http
License
NOASSERTION
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Safe, secure and cost-effective.

Connect your live data streams; Lens turns them into a cited knowledge graph your agent can reason over, through MCP, a REST API or its own assistant. It runs on your hardware with local models or any cloud model, private by default and cost-aware.

Install

curl -fsSL https://raw.githubusercontent.com/adeelahmad/lense/main/install.sh | sh

That one line is all: it opens an installer in your browser that checks the computer, then either installs with the defaults in one click (with a model server it finds on the computer) or asks how Lens should run (in Docker or a microsandbox microVM), the AI model and its key and any extras. Either way it installs what's missing (Docker included), starts Lens and opens its setup page (details). Run it again to update. On Windows, run irm https://raw.githubusercontent.com/adeelahmad/lense/main/install.ps1 | iex in PowerShell; or skip the terminal and double-click the launcher for your system from the latest release. Deployment covers servers and Cloudron; there are also packages for Synology, QNAP and Proxmox.

To work on the code instead, make run builds and runs everything from a checkout, make setup-code prints the first-admin setup code, and make dev runs it with hot reload; see Get started.

Why Lens

AI doesn't lack intelligence. It lacks structure. Lens gives your agent eyes. Without structure, every prompt is a guess about who you are and what happened. Lens sup

Read from source at commit a9e4a99cd55aOBSERVED · 2026-10-10
02

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 lens --env ARCHIVE_SECRET_KEY=${ARCHIVE_SECRET_KEY} --env AUTH_URL=${AUTH_URL} --env GITHUB_TOKEN=${GITHUB_TOKEN} --env HF_TOKEN=${HF_TOKEN} -- npx -y lens
claude-desktop
{
  "mcpServers": {
    "lens": {
      "command": "npx",
      "args": [
        "-y",
        "lens"
      ],
      "env": {
        "ARCHIVE_SECRET_KEY": "${ARCHIVE_SECRET_KEY}",
        "AUTH_URL": "${AUTH_URL}",
        "GITHUB_TOKEN": "${GITHUB_TOKEN}",
        "HF_TOKEN": "${HF_TOKEN}"
      }
    }
  }
}
03

Exposed tools (5)

5 read · 0 write · 0 destructive.

ToolRiskDescription
LensreadIntelligence for your agent. Safe, secure and cost-effective.
anthropic-agent-skillsreadAnthropic example skills
document-skillsreadDocuments
document_skillsreadDocuments
pdfreadPDF files
04

Trust audit

BLOCKgrade F · trust 44/100 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)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (4 observation(s))
Network
declared (6 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
install.sh:119
/.env" ... curl
Why it matters. reads secrets in the same file that sends data out
HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
fastapi_backend/app/domain/chats.py:29
_MARKS = re.compile("[--]")
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
docs/assistant.md:142
ignore previous instructions)"). `patterns` (the default) is free and kept narrow, so it misses rephrased attacks; `model` also
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
fastapi_backend/app/domain/components.py:103
importlib.import_module(m)
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
nextjs-frontend/components/admin/people-model.ts:52
"amber anchor apple arrow aspen basil beacon birch bramble breeze canyon cedar chalk cinder clover comet copper coral crane crystal dahlia delta ember fennel fern fjord flint forest garnet glacier gra
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
fastapi_backend/app/domain/calendars.py:53
text = text.lstrip("").replace("\r\n", "\n").replace("\r", "\n")
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
fastapi_backend/app/domain/chats.py:39
raw = (raw or "").lstrip("")
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
fastapi_backend/app/domain/extensions.py:394
text = (text or "").lstrip("")
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
fastapi_backend/app/domain/links.py:67
text = text.lstrip("")
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
fastapi_backend/app/domain/marketplace.py:302
text = text.lstrip("")
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
extensions/browser/edge/smoke.mjs:18
const TOKEN = "lih_edge-smoke-token";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
fastapi_backend/tests/api/test_prometheus.py:8
TOKEN = "0123456789abcdef0123456789abcdef"
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.docker.yaml
.pre-commit-config.docker.yaml
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
nextjs-frontend/.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
nextjs-frontend/.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.symlink · CWE-1104
docs/CHANGELOG.md
docs/CHANGELOG.md
Why it matters. link not followed
LOWInventory / provenance · inv.symlink · CWE-1104
docs/README.md
docs/README.md
Why it matters. link not followed
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
fastapi_backend/app/domain/bridge.py:181
key = hashlib.sha1(json.dumps([m.get("gateway"), m.get("channel"), m.get("account"), m.get("username")]).encode()).hexdigest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
fastapi_backend/app/domain/calendars.py:286
return hashlib.sha1(key(event).encode("utf-8")).hexdigest()[:16]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
fastapi_backend/app/domain/fedora.py:185
return hashlib.sha1(path.encode()).hexdigest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
fastapi_backend/app/domain/iiif.py:1037
fp = "iiif-" + hashlib.sha1(f"{url}#{c['canvas']}".encode()).hexdigest()[:24]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
fastapi_backend/app/domain/ingest.py:102
h = hashlib.sha1(str(size).encode())
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/browser-extension-firefox.yml:61
run: npx --yes "$WEB_EXT" build --source-dir dist/firefox --artifacts-dir ../../dist/firefox --filename lens-clipper-firefox.zip --overwrite-dest
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/browser-extension-firefox.yml:70
npx --yes "$WEB_EXT" sign --source-dir dist/firefox-selfhosted --artifacts-dir ../../dist/firefox/signed \

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha a9e4a99cd55afull audit observations/trust-audit/mcp-server/adeelahmad__lense.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10a9e4a99cd55aBLOCKF44first audit
06

Questions

What is the lense MCP server?

Lens: intelligence for your agent. Safe, secure and cost-effective. A self-hosted, cited knowledge graph and MCP server for your agents, from a Raspberry Pi to the cloud.

What tools does lense 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 lense safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (44/100) and found 3 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 lense need?

It reads ARCHIVE_SECRET_KEY, AUTH_URL, GITHUB_TOKEN, HF_TOKEN, LENS_INSTALLER_TOKEN, LENS_TEST_FEDORA_PASSWORD, LLAMA_ARG_API_KEY, NEXTAUTH_URL, SURREAL_PASS and TUNNEL_TOKEN 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 does lense run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as lens.

How current is this page?

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

Advertisement