Atlas / MCP servers / meta-taro / md-business

md-businessBLOCK

mcp/meta-taro/md-business

Business documents as Markdown — invoices, design docs and test sheets validated by JSON Schema, rendered to A4 PDF, and editable by AI agents through a built-in MCP server. Tauri desktop app + Chrome extension.

Verdict
BLOCK
Grade
F
Trust score
47 /100
Exposed tools
36 30r · 6w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
1
01

Overview

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

[](https://github.com/meta-taro/md-business/actions/workflows/ci.yml) [](./LICENSE) [](https://nodejs.org/) [](https://pnpm.io/) [](https://chromewebstore.google.com/detail/lmdplkkfmgapnhombimeohjliinifgjh)

[⬇ Download the desktop app](https://meta-taro.github.io/md-business/download/) (Windows / macOS) — installers, no build step. Or add the Chrome extension to read and print Markdown business documents in the browser.

English | 日本語
AI-native business documents, powered by Markdown as the source of truth.

md-business is an open-source framework for managing business documents as Markdown files with structured frontmatter, schemas, validation, Git history, and human-friendly viewers.

It is not just a Markdown viewer, a PDF generator, or a template collection.

md-business treats Markdown as the canonical source of truth for invoices, test specifications, design documents, API documents, database design documents, estimates, meeting notes, and other operational documents. AI agents can create, edit, validate, diff, and render these documents directly, while humans can review and consume them through familiar interfaces such as PDF, Google Workspace, Chrome, VS Code, PWA, desktop apps, or GitHub.

Why this exists

Most business documents still live inside tools designed primarily for humans:

  • Word processors
  • Spreadsheets
  • PDFs
  • Cloud drives
  • Office suites
  • SaaS back-office tools
  • Internal web forms

These tools are useful for human input and review, but t

Read from source at commit 170c948d15d4OBSERVED · 2026-10-11
Advertisement
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.

claude-code
claude mcp add schema-test-spec -- npx -y @md-business/[email protected]
claude-desktop
{
  "mcpServers": {
    "schema-test-spec": {
      "command": "npx",
      "args": [
        "-y",
        "@md-business/[email protected]"
      ]
    }
  }
}
03

Exposed tools (36)

30 read · 6 write · 0 destructive.

ToolRiskDescription
about_md_businessread
aggregateread
append_tsv_rowread
build_timelineread
capture_windowread
check_tsvread
close_documentread
create_documentwrite
data_to_tableread
declare_web_moderead
export_pdfread
filter_recordsread
get_schemaread
git_commitwrite
git_diffread
git_statusread
list_open_documentsread
list_schemasread
list_site_filesread
open_in_appread
ordersread注文ヘッダ
read_dataread
read_documentread
read_harread
read_linesread
read_site_fileread
read_tsvread
save_evidencewrite
search_documentsread
search_linesread
update_documentwrite
update_tsv_rowwrite
usersread利用者マスター
validate_documentread
web_mode_statusread
write_site_filewrite
04

Trust audit

BLOCKgrade F · trust 47/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 surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

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

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
apps/google-workspace-addon/src/lib/frontmatterEdit.ts:68
const parsed = yaml.load(yamlStr, { schema: yaml.JSON_SCHEMA });
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
apps/google-workspace-addon/src/lib/githubApi.ts:115
parsed = yaml.load(yamlStr, { schema: yaml.JSON_SCHEMA });
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
apps/google-workspace-addon/src/lib/sheetBinding.ts:40
parsed = yaml.load(yamlStr, { schema: yaml.JSON_SCHEMA });
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
apps/chrome-extension/vite.config.ts:45
const hasFn = code.includes("Function('return this')") || code.includes('Function("return this")');
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/mcp-server/src/gitRunner.ts:48
run: (args) => exec(buildGitArgs(getRoot(), args)),
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/scan-bundle.mjs:25
{ name: 'eval(', re: /\beval\s*\(/g },
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/scan-bundle.mjs:26
{ name: 'new Function(', re: /\bnew\s+Function\s*\(/g },
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/scan-bundle.mjs:29
{ name: 'Function("...")', re: /\bFunction\s*\(\s*['"`]/g },
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.binary · CWE-1104
apps/desktop/src-tauri/icons/icon.icns
icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/desktop/src-tauri/src/capture_win.rs:574
r#"<!doctype html><meta charset="utf-8"><body><script>fetch("http://127.0.0.1:{port}/")</script>"#
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/desktop/src-tauri/src/capture_win.rs:585
r#"<!doctype html><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=http://127.0.0.1:{port}/"><body>x"#
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
apps/chrome-extension/src/viewer/localSave.ts:4
const UTF8_BOM = '';
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
apps/google-workspace-addon/src/lib/uploadMarkdown.ts:7
const UTF8_BOM = '';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/google-workspace-addon/test/githubApi.test.ts:296
const secret = 'ghp_SECRETmiddleVISIBLE9999';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
apps/google-workspace-addon/test/githubApi.test.ts:277
const pat = 'github_pat_11ABCDEFG0somerandompayloadXYZ';
LOWInventory / provenance · inv.hidden_file · CWE-1104
apps/google-workspace-addon/.claspignore
.claspignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/.nojekyll
.nojekyll
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
apps/google-workspace-addon/test/frontmatterEdit.test.ts:73
const parsed = yaml.load(y) as { columns: Array<{ name: string; type: string }> };
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
apps/google-workspace-addon/test/frontmatterEdit.test.ts:86
const parsed = yaml.load(extractFrontmatter(r.newSrc).yaml) as {
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
apps/desktop/src/lib/workspace/shareLink.test.ts:51
expect(parseShareLink('md-business://open?repo=github.com/o/r&path=../../.ssh/id_rsa')).toBeNull();
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
apps/desktop/src-tauri/src/git.rs:1957
assert!(!is_valid_commit_path("docs/../../x.md"), "途中の .. も拒否");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
apps/desktop/src-tauri/src/preview_server_logic.rs:596
route(TOKEN, &format!("/{}/../../etc/passwd", TOKEN)),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
apps/desktop/src-tauri/src/preview_server_logic.rs:597
Route::Page("../../etc/passwd".to_string())
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
apps/desktop/src/lib/capabilities.test.ts:27
readFileSync(fileURLToPath(new URL('../../src-tauri/capabilities/default.json', import.meta.url)), 'utf8'),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
apps/desktop/src/lib/chart/loadCharts.test.ts:85
const out = await load(chart('type: line\nsource: ../../外.tsv\nx: 日付\ny: セッション'), {

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 170c948d15d4full audit observations/trust-audit/mcp-server/meta-taro__md-business.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-11170c948d15d4BLOCKF47first audit
06

Questions

What is the md-business MCP server?

Business documents as Markdown — invoices, design docs and test sheets validated by JSON Schema, rendered to A4 PDF, and editable by AI agents through a built-in MCP server. Tauri desktop app + Chrome extension.

What tools does md-business expose?

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

Is md-business safe to connect to an agent?

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

No credential environment variables were found in its source, so it appears to need none.

How does md-business run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @md-business/schema-test-spec at 0.0.0.

How current is this page?

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

Advertisement