1pub mod manifest;
15pub mod optimizer;
16pub mod report;
17pub mod ris;
18pub mod rules;
19pub mod sarif;
20
21use thiserror::Error;
22
23pub use manifest::{Manifest, Tool};
24pub use optimizer::{DescriptionOptimizer, HeuristicOptimizer, OptimizationOutcome};
25pub use report::{Report, ToolReport};
26pub use ris::{RisBreakdown, RisScore};
27pub use rules::{Finding, RuleId, Severity};
28
29#[derive(Debug, Error)]
31pub enum SentinelError {
32 #[error("invalid MCP manifest: {0}")]
33 InvalidManifest(String),
34 #[error("io error: {0}")]
35 Io(#[from] std::io::Error),
36 #[error("json error: {0}")]
37 Json(#[from] serde_json::Error),
38}
39
40pub fn scan(bytes: &[u8]) -> Result<Report, SentinelError> {
42 let manifest = manifest::Manifest::from_slice(bytes)?;
43 Ok(Report::build(&manifest))
44}
45
46pub fn optimize(bytes: &[u8]) -> Result<Vec<OptimizationOutcome>, SentinelError> {
48 let manifest = manifest::Manifest::from_slice(bytes)?;
49 let opt = HeuristicOptimizer::default();
50 Ok(manifest
51 .tools
52 .iter()
53 .map(|t| opt.rewrite(t))
54 .collect::<Vec<_>>())
55}