Atlas / MCP servers / redpanda-data / Property Extractor Unit Tests

Property Extractor Unit TestsBLOCK

mcp/redpanda-data/docs-extensions-and-macros

Extensions and macros developed for Redpanda documentation.

Verdict
BLOCK
Grade
F
Trust score
52 /100
Exposed tools
131 125r · 4w · 2d
Transport
stdio
License
—
Stars
8
01

Overview

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

Overview

Comprehensive unit tests for the Redpanda property extraction system. These tests validate the transformer pipeline that processes C++ property declarations into JSON documentation format.

Test Coverage

EnterpriseTransformer Tests (5 tests)

  • test_restricted_only_with_enum_vector: Validates correct classification when a property has restricted values AND an enum definition vector (enum is superset)
  • test_restricted_with_sanctioned_disjoint_values: Validates classification when restricted and sanctioned values are disjoint sets
  • test_restricted_only_single_vector: Tests simple restricted_only pattern with a single restriction vector
  • test_non_enterprise_property: Ensures non-enterprise properties are correctly flagged
  • test_simple_enterprise_property: Tests simple enterprise properties with lambda validators

ParamNormalizerTransformer Tests (3 tests)

  • test_normalize_restriction_at_position_0: Validates normalization when restriction vector is at parameter position 0
  • test_normalize_restriction_at_position_1: Validates normalization when restriction vector is at parameter position 1
  • test_skip_normalization_for_literals: Ensures properties starting with literals are not normalized

TypeTransformer Tests (4 tests)

  • test_extract_type_from_property_declaration: Extracts inner type from property declarations
  • test_extract_type_from_vector: Extracts type from std::vector declarations
  • test_extract_type_from_one_or_many: Extracts type from one_or_many_property declarations
  • test_map_cpp_type_to_json_schema: Validates C++ to JSON Schema type mappings

BasicInfoTransformer Tests (3 tests)

  • test_extract_name_and_description: Validates basic property name and description extraction
  • test_skip_lambda_validators: Ensures lambda validator parameters are correctly skipped when finding property names
  • test_normalize_file_path: V
Read from source at commit 2d05341775b0OBSERVED · 2026-10-11
Advertisement
02

Exposed tools (131)

125 read · 4 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
AIreadAI processors.
MyConnectorreadA simple connector.
ParsingreadParsers.
ServicesreadInputs that consume from services.
aclreadAcl command.
admin_apireadx
agentreadAgent command.
aireadAI command.
aimreadnot ai: prefix must respect word boundary
api-description-too-shortreadProse doc string too short to explain anything
api-missing-terminal-periodreadProse doc string with no terminal period
api-name-echoreadDescription merely restates the declared name (tautology)
api-rpc-summary-not-separatedreadrpc comment has no blank line, so the whole comment becomes the summary
api-summary-multilinereadAn operation summary must be a single line
api-summary-terminal-periodreadAn operation summary takes no terminal period
api-undocumented-fieldreadPublished field or message with no doc string
api_versionreadAffects endpoint paths (
audit_overridesreadAudit docs-side overrides against extracted source strings
auto_deletedestructiveWhether the queue auto-deletes.
balancer-statusreadCheck status. FIELDS Original fields content here. NOTES Some notes.
bang-bang-calloutread!!TEXT!! style callouts are not allowed
barreaddesc2
bazreadno match
blankread
broken-macroreadxref:/glossterm:/config_ref: macro with unbalanced brackets
bucketreadBucket name.
bundlereadCollect a bundle.
checkpoint_limitreadThe maximum number of messages that can be processed at a given time per partition.
client_secretreadSensitive: prefer environment variable interpolation (
cloudreadCloud command.
clusterreadCluster desc
cluster_idreadCluster identifier.
coming-soon-placeholderreadComing soon placeholder content
connectreadRedpanda Connect plugin
connect-availability-prosereadCloud or cgo availability written as prose instead of data
connect-cli-usage-multilinereadurfave/cli Usage is a one-line label
connect-env-conditionalreadAsciiDoc ifdef/ifndef conditional in a Go spec string
connect-short-description-markupreadShortDescription is plain text in form-based editors
connect-xref-modulereadxref without a module, or to a module the Connect docs do not have
countreadOld desc
createwriteOriginal description
data_dirready
dead-markerreadA # -- marker no docs pipeline can attach to any key
debugreadDebug a Redpanda SQL cluster.
deletedestructiveDelete topic
duplicate-contentreadDuplicate paragraphs or sections
em-dashreadEm dash in prose that ships to docs.redpanda.com
empty-descriptionreadDeclaration ships with no doc string at all
fieldAreadoriginal desc
fooreaddesc1
generate_bundle_openapireadBundle Redpanda OpenAPI fragments. Creates complete OpenAPI 3.1 documents for admin and/or connect APIs by bundling fragments from the Redpanda repository. Writers use this when updating API reference docs.
generate_cloud_regionsreadGenerate cloud regions table documentation. Creates a Markdown or AsciiDoc table of cloud regions and tiers from GitHub YAML data. Writers use this when updating cloud region documentation.
generate_crd_docsreadGenerate Kubernetes CRD (Custom Resource Definition) documentation. Creates AsciiDoc documentation for Kubernetes operator CRDs. Writers use this when updating operator reference docs.
generate_helm_docsreadGenerate Helm chart documentation. Creates AsciiDoc documentation for Helm charts from local directories or GitHub repositories. Writers use this when updating Helm chart reference docs.
generate_metrics_docsreadGenerate Redpanda metrics documentation for a specific version. Creates the public metrics reference page. Writers use this when updating metrics docs for a new release. Can run in background with progress streaming.
generate_property_docsreadGenerate property documentation
generate_rpcn_connector_docsreadGenerate Redpanda Connect connector documentation. Creates component documentation for all connectors. Writers use this when updating connector reference docs. Automatically uses docs-data/overrides.json if present.
generate_rpk_docsreadGenerate rpk command-line documentation using the JSON-based
get_antora_structurereadGet information about the Antora documentation structure in the current repository, including components, modules, and available directories. Use this to understand the docs organization.
get_console_versionreadGet the latest Redpanda Console version information including version number, Docker tag, and release notes URL.
get_job_statusreadGet the status and progress of a background job. Use this to check on long-running documentation generation tasks.
get_redpanda_versionreadGet the latest Redpanda version information including version number, Docker tag, and release notes URL. Writers use this to find out what version to document.
go-field-name-firstreadDescription leads with the Go field name instead of the YAML key
groupreadx
healthreadHealth command.
inforeadInfo command.
inherited-type-descriptionreadField with no comment publishes its Go type\
inline-allcaps-warningreadALLCAPS warnings in middle of paragraph (not standalone admonitions)
innerreadorig
installwritey
internalreadPartial-only child.
invalid-xref-syntaxreadxref: followed by http URL (invalid)
k8sreadKubernetes plugin
latin-abbreviationreadLatin abbreviation instead of plain English
lintreadLint a config
listreadList command.
list_jobsreadList all background jobs with optional filtering. Use this to see recent documentation generation jobs and their status.
llmreadx
loginreadLogin command.
markdown-emphasisreadMarkdown-style **text** should be AsciiDoc
misattached-markerreadOne # -- marker is published under two different keys
missing-field-descriptionreadConfig field constructed with no .Description()
missing-inline-codereadCode value or field name in prose without inline code
missing-terminal-periodreadProperty descriptions are complete sentences ending in a period
name-echoreadDescription merely restates the declared name (tautology)
offsetreadOriginal offset desc
org_urlreadProduction orgs use
otlp_httpreadTraces go to
preadAlready a string.
partitionsreadOriginal
plainreadUntouched string.
prop_redundantreadSame text.
prop_upstreamablereadOld text.
raw-external-urlsreadRaw external URLs that should be links or removed
raw-pipereadRaw unescaped | outside backticks breaks AsciiDoc tables
replicationreadOriginal too
review_generated_docsreadValidate auto-generated documentation for structural issues. Checks for missing descriptions, invalid $refs, DRY violations, invalid xrefs, and calculates quality scores. For style and tone review, use the content-reviewer agent from docs-team-standards.
rpc_serverreadMentions admin_api and also data_dir in one paragraph.
rpkreadRoot
rpk-long-allcaps-headingreadALLCAPS line in Long becomes a === heading in the docs
rpk-long-block-delimiterreadA standalone ==== or ---- line in Long breaks AsciiDoc blocks
rpk-short-multilinereadShort must be a single line
rpk-terminal-periodreadShort and flag usage strings do not end with a period
runwriteRun a pipeline
run_doc_tools_commandwriteAdvanced: Run a raw doc-tools command. Only use this if none of the specific tools above fit your needs. Requires knowledge of doc-tools CLI syntax.
secretreadSecret command.
securityreadSecurity command.
sentinel-default-unexplainedreadProperty defaults to a sentinel whose meaning the description never explains
sqlreadInteract with a Redpanda SQL cluster.
sqlxreadprefix must respect word boundary
starts-lowercasereadDescription starts with a lowercase letter
testreadDescription. EXAMPLES Some examples.
test-cmdreadTest command. EXAMPLES First example rpk test-cmd --flag1 Second example to exclude rpk test-cmd --exclude-me Third example rpk test-cmd --flag3
test_propertyreadThe source description.
too-shortreadDescription is under 20 characters
topicreadTopic commands
trailing-periodreadMetric descriptions do not end with a period
trim-prefixreadTrim records
truncated-descriptionreadDescription appears truncated or garbled
unbalanced-backticksreadOdd number of backticks ships broken markup
undocumented-fieldreadExported user-facing field with no doc comment
undocumented-keyreadKey helm-docs publishes with an empty description
unexpanded-jargonreadInternal jargon that ships to users unexpanded
unknown-attributeread{attr} reference that is not a known product attribute
unverifiable-descriptionreadDescription argument is not a plain string literal
urlreadQueue URL.
urlsreadA list of URLs.
usernamereadUsername for authentication
versionreadVersion command.
widgetreadWidget things.
zero_key_warn_intervalreadWarn interval.
03

Trust audit

BLOCKgrade F · trust 52/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

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

What the source does

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

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
bin/mcp-tools/antora.js:48
playbookContent = yaml.load(fs.readFileSync(playbookPath, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
bin/mcp-tools/antora.js:82
const content = yaml.load(fs.readFileSync(ymlPath, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
tools/property-extractor/property_extractor.py:1786
result = eval(' '.join(evaluated_tokens))
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.binary · CWE-1104
docker-compose/25.1/transform/regex.wasm
regex.wasm
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
docker-compose/transform/regex.wasm
regex.wasm
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
extensions/util/connect-docs-asset.js:140
logger.warn(`The GitHub API found no ${tag} release of ${OWNER}/${REPO} with the GitHub token, and the public download has no ${ASSET_NAME} either. If the repo is private, check that the token has rea
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
auto_delete, delete
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
__tests__/fixtures/e2e-site/ui-bundle.zip
ui-bundle.zip
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-please-manifest.json
.release-please-manifest.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
.github/scripts/embed-guard-script.js:51
const parsed = yaml.load(workflowSource);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
__tests__/workflows/kapa-source-groups-drift.test.js:99
const parsed = yaml.load(fs.readFileSync(WORKFLOW_PATH, 'utf8'));
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
__tests__/workflows/kapa-source-groups-drift.test.js:328
const parsed = yaml.load(workflow);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
__tests__/workflows/property-corpus-drift.test.js:343
const evalCond = (expr) => eval(expr.replace(/github\.ref/g, JSON.stringify(ref)));
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/scripts/derive-property-snapshot.js:32
const { normalizeIncludes } = require(path.join(__dirname, '../../tools/property-extractor/helpers/applyPropertyLinks.js'))
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
__tests__/cli-utils/big-int-json.test.js:3
const bigIntJson = require('../../cli-utils/big-int-json')
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
__tests__/cli-utils/big-int-json.test.js:101
const file = path.join(__dirname, '../../preview/redpanda-connect/docs-data/connect-latest.json')
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
__tests__/cli-utils/diff-utils.test.js:7
const { updatePropertiesJsonWithVersion, resolveDiffBaseline } = require('../../cli-utils/diff-utils.js');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
__tests__/cli-utils/diff-utils.test.js:180
expect(() => resolveDiffBaseline(tmpDir, '../../etc/passwd')).toThrow(/attachments directory/);
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
.github/workflows/doc-strings-review.yml:632
# exfiltrate it over plaintext.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
__tests__/e2e/link-extensions.e2e.test.js:68
const externalBase = `http://127.0.0.1:${external.port}`
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
__tests__/tools/rpk-docs/generate-rpk-docs.test.js:1542
expect(formatDescription('Point it at http://127.0.0.1:8081.')).toBe('Point it at `http://127.0.0.1:8081`.')
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@asciidoctor/tabs, @bufbuild/buf, @modelcontextprotocol/sdk, @octokit/core, @octokit/plugin-retry, @octokit/rest, @redocly/cli, ajv
Why it matters. 36 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
tools/property-extractor/package.json
handlebars
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
tools/property-extractor/requirements.txt
setuptools, pyyaml, requests, pytest
Why it matters. 4 requirement(s) not pinned with ==
Fix. pin exact versions

Gates applied: no_behavioural_pass, no_license.

Audited 2026-10-11 · audit v0.4.1 · source sha 2d05341775b0full audit observations/trust-audit/mcp-server/redpanda-data__docs-extensions-and-macros.json · Report an issue / request a re-scan
04

Audit history

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

DateSourceVerdictGradeScoreChange
2026-10-112d05341775b0BLOCKF52first audit
05

Questions

What is the @redpanda-data/docs-extensions-and-macros MCP server?

Extensions and macros developed for Redpanda documentation.

What tools does @redpanda-data/docs-extensions-and-macros expose?

131 in total: 125 read-only, 4 that write, and 2 that can delete or overwrite (auto_delete, delete). Every one is listed on this page with its risk.

Is @redpanda-data/docs-extensions-and-macros safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (52/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. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @redpanda-data/docs-extensions-and-macros need?

It reads ACTIONS_BOT_TOKEN, ALGOLIA_ADMIN_API_KEY, GH_TOKEN, GITHUB_TOKEN, GIT_CREDENTIALS and REDPANDA_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 @redpanda-data/docs-extensions-and-macros run?

It speaks stdio, so it runs as a local process your client starts.

How current is this page?

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

Advertisement