Atlas / MCP servers / thallylabs / Thally

ThallyCAUTION

mcp/thallylabs/thally

Open-source docs platform and product knowledge layer that turns merged product changes into evidence-backed updates for human review.

Verdict
CAUTION
Grade
C
Trust score
75 /100
Exposed tools
29 20r · 9w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
5
01

Overview

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

Build and publish Git-owned docs for people and AI tools with Thally's MIT-licensed documentation engine and public toolchain. One MDX source can serve HTML, Markdown, structured JSON, JSON-LD, llms.txt, RSS, and a live MCP endpoint. Self-host it or connect the site to Thally Cloud.

Start a docs site

npx create-thally-docs my-docs
cd my-docs
npm run dev

create-thally-docs installs dependencies by default (pass --no-install to skip) and prints the exact preview command. Sites that include the thally CLI as a dev dependency can also run npx thally dev, which prints the local llms.txt and MCP endpoints plus a claude mcp add command once the server is ready.

Or clone the dedicated starter directly:

npx degit thallylabs/starter my-docs
cd my-docs
npm install
npm run dev

The server starts at http://localhost:3040, or the next available port when 3040 is already in use.

Keep product knowledge aligned

The product knowledge layer for software teams.

Your product changed. Did your docs, website, and help center? Connect the repositories that define your product and the places customers learn about it. When a pull request merges, Thally Track gathers the evidence, traces the impact, and opens evidence-backed pull requests for your team to review. A no-change result is valid. Nothing publishes without human approval.

Features

  • MDX content — write docs in Markdown with React components
  • Unified content engine — each page is parsed once into a typed content graph; HTML, JSON, JSON-LD, Markdown, search, and embeddings are all projections of that one model
  • Auto-generated API reference — drop in an OpenAPI spec and get interactive docs with a "Try It" console
  • Sidebar & tabs — configured from a single docs.json file
  • Hybrid search — instant client-side command palette plus a server-side full-text + vector /api/search
  • Retrieval-grounded AI chat — Q&A wi
Read from source at commit 500ec109e056OBSERVED · 2026-10-12
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 migrate --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env DOX_ACCESS_PASSWORD=${DOX_ACCESS_PASSWORD} --env DOX_ACCESS_SECRET=${DOX_ACCESS_SECRET} --env DOX_ADMIN_PASSWORD=${DOX_ADMIN_PASSWORD} -- npx -y @thallylabs/[email protected]
claude-desktop
{
  "mcpServers": {
    "migrate": {
      "command": "npx",
      "args": [
        "-y",
        "@thallylabs/[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "DOX_ACCESS_PASSWORD": "${DOX_ACCESS_PASSWORD}",
        "DOX_ACCESS_SECRET": "${DOX_ACCESS_SECRET}",
        "DOX_ADMIN_PASSWORD": "${DOX_ADMIN_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (29)

20 read · 9 write · 0 destructive.

ToolRiskDescription
ContentreadRead and search the published documentation corpus.
DiscoveryreadDiscover published pages and capabilities.
DocsreadFixture docs
Documentationread
ReadinessreadInspect machine-readability health.
ThallyreadThally is the product knowledge layer for software teams. It keeps your docs, website, and support platform in sync as your product changes.
add_pagewriteAdd a new MDX page to a Thally project and register it in docs.json navigation
add_tabwriteAdd a new top-level tab to a Thally project navigation (content tab or redirect link)
agent_readinessreadFetch the Agent Readiness Score (0-100) for a deployed Thally site — the same report as /api/agent-readiness and
api-operationreadOne API reference operation as compact Markdown, by operation id (see list_api_operations).
connect-mcpreadAttach an MCP client to this site and use its docs as native tools.
create_projectwriteScaffold a new Thally documentation project from the GitHub template
get_contextreadGet the most relevant documentation context for a topic or question, within a token budget
import_docswriteImport content into an existing Thally project without scaffolding; use only when an in-place import is explicitly requested
lint_projectreadCheck a Thally project for issues: broken nav references, orphan files, missing frontmatter
list_pagesreadList pages.
migrate_docswriteCreate a fresh canonical Thally template, then migrate a GitHub repository or public docs site into it; the target must be new or empty
pagereadAny published documentation page as Markdown, by page ID (e.g. docs://pages/guides/authentication).
read-page-markdownreadFetch any documentation page as clean Markdown instead of HTML.
read_api_specreadRead a bounded UTF-8 window from an OpenAPI JSON or YAML source configured by this project; follow next-start-byte until complete
read_pagewriteRead a bounded UTF-8 body window from a documentation page; follow next-start-byte until complete before replacing a page
replace_page_textreadReplace one exact unique span in an existing MDX page; prefer this for small edits so the full page never travels through the model response
search-docsreadSearch this documentation site and retrieve ranked, cited results.
search_docsreadSearch documentation pages by keyword — returns ranked list of matching pages
semantic_searchreadHybrid (full-text + vector) semantic search against a deployed Thally site — uses the same index as the in-app command palette and /api/search
sync_from_repowriteThally Track: analyze a merged pull request in a tracked product repo and preview the docs task it would produce (dryRun), or dispatch it to the docs repo so the docs agent drafts a documentation PR
translate_docsreadTranslate Thally documentation pages to a secondary locale using Claude AI
update_api_specwriteReplace and validate an OpenAPI JSON or YAML source explicitly configured by this Thally project
update_pagewriteUpdate one page.
04

Trust audit

CAUTIONgrade C · trust 75/100 Install with care. The audit found things worth knowing before you trust its output.

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

What the source does

Filesystem
none-observed
Network
declared (4 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

MEDIUMInventory / provenance · inv.binary · CWE-1104
src/lib/ai-chat-suggestions.ts
ai-chat-suggestions.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/mint-reader-token.ts:31
console.log(minted.token)
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
packages/migrate/src/mdx.ts:443
const BARE_IDENTIFIER_PATH = /^[\p{ID_Start}$_][\p{ID_Continue}$]*(?:\.[\p{ID_Start}$_][\p{ID_Continue}$]*)*$/u
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
packages/migrate/src/mdx.ts:453
const BARE_OBJECT_SHORTHAND = /^\{\s*([\p{ID_Start}$_][\p{ID_Continue}$]*)\s*\}$/u
LOWInventory / provenance · inv.hidden_file · CWE-1104
.env.production
.env.production
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/migrate/src/__tests__/repository.test.ts:4660
"export const viaFunction = () => Function('return process')().env;",
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
src/mdx/inline-component-migration.test.ts:34
new Function('exports', 'require', output)(exports, (specifier: string) => {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/src/__tests__/cli-version.test.ts:8
const cliPath = fileURLToPath(new URL('../../dist/index.js', import.meta.url))
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/cli/src/__tests__/cli-version.test.ts:9
const packageMetadata = createRequire(import.meta.url)('../../package.json') as {
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/content/__tests__/document-source.test.ts:20
for (const pageId of ['../secret', 'guides/../../secret', '/absolute', 'guide\\secret', 'guide\u0000secret']) {
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/content/__tests__/parse.test.ts:3
import { slugify } from '../../slugify'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/core/src/content/__tests__/updates.test.ts:9
import { updateAnchorId } from '../../slugify'
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/create-thally-docs/src/__tests__/external-links.test.ts:27
'http://169.254.169.254/latest/meta-data',
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
src/app/api/try-it/route.test.ts:408
for (const server of ['http://127.0.0.1', 'http://localhost:3000', 'http://169.254.169.254', 'http://10.0.0.5']) {
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/cli/src/__tests__/commands.test.ts:12
expect(parseDevServerUrl('   - Network:      http://192.168.1.4:3040')).toBeUndefined()
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/create-thally-docs/src/__tests__/external-links.test.ts:24
'http://127.0.0.1/admin',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/create-thally-docs/src/__tests__/external-links.test.ts:26
'http://10.0.0.5/',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/create-thally-docs/src/__tests__/external-links.test.ts:27
'http://169.254.169.254/latest/meta-data',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/create-thally-docs/src/__tests__/scaffold-hygiene.test.ts:362
'# Site URL\nTHALLY_SITE_URL=http://localhost:3040\nNEXT_PUBLIC_SITE_URL="http://127.0.0.1:3000/"\n# ANTHROPIC_API_KEY=\n',
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/lib/admin/auth-edge.ts:60
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/lib/cloud-link/edge.ts:80
return atob(padded)
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
packages/migrate/src/__tests__/analytics.test.ts:65
['unicode lookalike', { ga4: { measurementId: 'G-ТEST1234' } }],
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/lib/__tests__/analytics-config.test.ts:122
['GA4 unicode lookalike', { ga4: { measurementId: 'G-ТEST1234' } }, 'ga4', false],
LOWObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
src/lib/__tests__/analytics-config.test.ts:151
['Plausible unicode', { plausible: { domain: 'dоcs.example.com' } }, 'plausible', false],
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
packages/migrate/src/__tests__/mdx.test.ts:1171
const body = '---\ndescription: "{x}"\n---\n\n{vendor}'

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 500ec109e056full audit observations/trust-audit/mcp-server/thallylabs__thally.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-12500ec109e056CAUTIONC75first audit
06

Questions

What is the @thallylabs/mcp MCP server?

Open-source docs platform and product knowledge layer that turns merged product changes into evidence-backed updates for human review.

What tools does @thallylabs/mcp expose?

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

Is @thallylabs/mcp safe to connect to an agent?

With care. The audit graded it C (75/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does @thallylabs/mcp need?

It reads ANTHROPIC_API_KEY, DOX_ACCESS_PASSWORD, DOX_ACCESS_SECRET, DOX_ADMIN_PASSWORD, DOX_ADMIN_SECRET, DOX_ANALYTICS_SECRET, DOX_AUTH_SECRET, DOX_CLOUD_SITE_TOKEN, DOX_DATABASE_TOKEN, DOX_EMBEDDING_API_KEY, DOX_GITHUB_APP_PRIVATE_KEY and DOX_GITHUB_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 @thallylabs/mcp run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @thallylabs/migrate at 0.2.27.

How current is this page?

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

Advertisement