Dossier Architecture Overview
High-level architecture overview of the Dossier project.
System Architecture
Dossier consists of three main components in a monorepo structure:
dossier/
βββ packages/core/ # @ai-dossier/core - Verification library
βββ cli/ # @ai-dossier/cli - CLI tool
βββ mcp-server/ # @ai-dossier/mcp-server - MCP integration
Component Overview
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β End Users / AI Agents β
ββββββββββββββ¬βββββββββββββββββββββββββββββ¬βββββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββ ββββββββββββββββββββ
β @ai-dossier/cli β β @ai-dossier/mcp β
β β β β
β - Verify β β - Discover β
β - Download β β - Verify β
β - Execute β β - Execute β
βββββββββ¬ββββββββ ββββββββββ¬ββββββββββ
β β
ββββββββββββββ¬ββββββββββββββββ
β
βΌ
ββββββββββββββββββ
β @ai-dossier/core β
β β
β - Parser β
β - Checksum β
β - Signature β
β - Types β
ββββββββββββββββββ
Core Library (@ai-dossier/core)
Purpose: Shared verification and parsing logic
Key Modules:
parser.ts- Dossier parsing (frontmatter + body)checksum.ts- SHA256 integrity verificationsignature.ts- Minisign & AWS KMS signature verificationtypes.ts- TypeScript type definitions
Dependencies:
@aws-sdk/client-kms- AWS KMS integrationtweetnacl- Ed25519 cryptography (Minisign)
Exports:
export interface Dossier {
metadata: DossierMetadata;
body: string;
}
export function parseDossier(content: string): Dossier
export function verifyChecksum(dossier: Dossier): boolean
export function verifySignature(dossier: Dossier): SignatureResult
CLI Tool (@ai-dossier/cli)
Purpose: Command-line verification for users
Entry Point: bin/ai-dossier
Flow:
User Command
β
Download/Read File
β
Parse Dossier (using @ai-dossier/core)
β
Verify Checksum
β
Verify Signature (if present)
β
Risk Assessment
β
Exit 0 (safe) or 1 (unsafe)
Features:
- Local file and URL support
- Verbose mode for debugging
- Exit codes for scripting
- Human-readable output
Multi-Registry Resolution
The CLI supports querying multiple registries in parallel when resolving dossiers. This is handled by the multi-registry module (cli/src/multi-registry.ts).
Resolution strategy: All configured registries are queried simultaneously using Promise.allSettled(). For get operations (multiRegistryGetDossier, multiRegistryGetContent), the first successful result is returned. For list/search operations (multiRegistryList, multiRegistrySearch), results from all successful registries are merged. In both cases, per-registry errors are collected and returned alongside the result.
User: dossier get org/my-dossier
β
Resolve configured registries (config.ts)
β
Query ALL registries in parallel (Promise.allSettled)
ββββββββββΌβββββββββ
β β β
Registry A Registry B Registry C
β β β
ββββββββββΌβββββββββ
β
Return { result, errors }
Structured error returns: All multi-registry functions return a structured object instead of a bare value:
// multiRegistryGetDossier returns:
{
result: LabeledDossierInfo | null, // First successful result, or null
errors: Array<{ registry: string; error: string }> // Per-registry errors
}
// multiRegistryGetContent returns:
{
result: (DossierContentResult & { _registry: string }) | null,
errors: Array<{ registry: string; error: string }>
}
// multiRegistryList / multiRegistrySearch return:
{
dossiers: LabeledDossierListItem[], // Merged results from all registries
total: number,
errors: Array<{ registry: string; error: string }>
}
This pattern ensures that:
- Partial failures are surfaced: If one registry is down but another succeeds, the caller gets both the result and the error details.
- Callers can distinguish βnot foundβ from βall registries failedβ: When
resultisnullanderrorsis non-empty, at least one registry encountered an error. Whenresultisnullanderrorsis empty, no registries are configured. - Registry source is always labeled: Each result includes a
_registryfield identifying which registry provided it.
MCP Server (@ai-dossier/mcp-server)
Purpose: Integration with AI agents via Model Context Protocol
Architecture:
MCP Client (Claude, etc.)
β
MCP Protocol (stdio)
β
@ai-dossier/mcp-server
βββ Resources (discover dossiers)
βββ Tools (verify, execute)
βββ Prompts (templates)
Key Features:
- Resource discovery (list available dossiers)
- Verification tools
- Execution capabilities
- Template prompts for common workflows
Verification Flow
Checksum Verification
1. Extract body from dossier (everything after frontmatter)
2. Calculate SHA256 hash of body
3. Compare with checksum in frontmatter
4. Match β β
| Mismatch β β BLOCK
Signature Verification
1. Check if signature present in frontmatter
2. Determine signature type (Minisign | AWS KMS)
3. Extract public key
4. Verify signature against body
5. Check if key is trusted
6. Valid + Trusted β β
| Invalid β β BLOCK
Security Architecture
See ../../security/ARCHITECTURE.md for detailed security architecture.
Key Principles:
- Fail secure: Default to blocking on verification failure
- Defense in depth: Multiple verification layers
- Cryptographic verification: SHA256 + optional signatures
- Trust management: User-controlled trusted keys
Data Flow
Dossier Creation
Author writes dossier.md
β
Calculate SHA256 checksum
β
(Optional) Sign with Minisign/KMS
β
Add checksum + signature to frontmatter
β
Publish dossier.ds.md
Dossier Execution
User/Agent requests dossier
β
Download/Read file
β
Verify checksum (integrity)
β
Verify signature (authenticity)
β
Risk assessment
β
Execute (if verified) or BLOCK
Package Structure
Monorepo (npm workspaces)
{
"workspaces": [
"packages/*",
"mcp-server",
"cli"
]
}
Build Process:
- Build @ai-dossier/core (TypeScript β JavaScript)
- Publish @ai-dossier/core to npm
- Publish @ai-dossier/cli (depends on core)
- Publish @ai-dossier/mcp-server (depends on core)
Technology Stack
- Language: TypeScript / JavaScript
- Runtime: Node.js β₯ 20
- Build: TypeScript Compiler (tsc)
- Package Manager: npm
- Distribution: npm
- CI/CD: GitHub Actions
Design Decisions
Key architectural decisions are documented in Architecture Decision Records (ADRs).
External Dependencies
Production
@aws-sdk/client-kms- AWS Key Management Servicetweetnacl- Ed25519 cryptography@modelcontextprotocol/sdk- MCP protocol (mcp-server only)zod- Schema validation (mcp-server only)
Development
typescript- Type safety and compilation@types/node- Node.js type definitions
Future Architecture
Planned enhancements:
- Plugin system for custom verifiers
- WebAssembly build for browser support
- Distributed dossier registry
- P2P verification networks
See ../planning/roadmap.md for details.
Related Documentation
Rendered from docs/architecture/overview.md in the repository. Edit it there.