augure-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 766c5afcc703993f7c40d24808548eb68a5b6363b760897f11f08d638d4bcfd2
4
+ data.tar.gz: 4b6729a546f1620195c5cd2e580294df242a2796168bfea803f09f46c00c5ee0
5
+ SHA512:
6
+ metadata.gz: 744c4a03191801f48e5f054b8d8c3ffc86f9f2b071e20ee3ca6d30bd773d68266b5dc5c4a2400a2f961c87ed30af475b07c6f9470c941c01c43afbad50fdc5bc
7
+ data.tar.gz: c9506146189ad12ee6de26ac65d2a302f8a4ea103630af91d43f72410461d08e8c265544fa14f330ac4fa2de4d30b0c6fd132eed9a90aad03cea3298db858cff
data/exe/augure-mcp ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "augure-mcp"
5
+
6
+ transport = MCP::Server::Transports::StdioTransport.new(AugureMcp::Server.build)
7
+ transport.open
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "augure-mcp"
5
+
6
+ transport = MCP::Server::Transports::StdioTransport.new(AugureMcp::Server.build)
7
+ transport.open
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mcp"
4
+ require "augure"
5
+
6
+ module AugureMcp
7
+ # The MCP surface of the decision layer: READ-ONLY by design. The server
8
+ # executes nothing - it is the SDK boundary. An LLM that asks "which
9
+ # technique?" gets a verified, explained decision instead of a guess.
10
+ class Server
11
+ TOOLS = [
12
+ AnalyzeTarget = Class.new(MCP::Tool) do
13
+ description "Analyze an augure fact file (or raw facts) and return the " \
14
+ "auditable decision: applicable techniques, verified checks, " \
15
+ "deterministic ranking, seeded selection, plan and the full " \
16
+ "provenance (rule IDs + evidence). Read-only; executes nothing."
17
+ input_schema(
18
+ properties: {
19
+ facts: {type: "string", description: "Raw facts text (predicate lines)"},
20
+ facts_file: {type: "string", description: "Path to a .facts file"},
21
+ seed: {type: "integer", description: "Optional seed for reproducible draws"}
22
+ }
23
+ )
24
+
25
+ class << self
26
+ def call(facts: nil, facts_file: nil, seed: nil, server_context: nil)
27
+ text = facts || (facts_file && File.read(facts_file))
28
+ return MCP::Tool::Response.new([{type: "text", text: "error: provide facts or facts_file"}]) unless text
29
+
30
+ result = ::Augure::Pipeline.analyze(facts: text, seed: seed ? Integer(seed) : nil)
31
+ MCP::Tool::Response.new([{type: "text", text: JSON.pretty_generate(
32
+ applicable: result[:applicable],
33
+ verified: result[:verified],
34
+ ranking: result[:ranking],
35
+ selected: result[:selected],
36
+ plan: result[:plan],
37
+ explain: result[:explain]
38
+ )}])
39
+ rescue ::Augure::MalformedFact, ::Augure::UnknownPredicate => e
40
+ MCP::Tool::Response.new([{type: "text", text: "error: #{e.message}"}])
41
+ end
42
+ end
43
+ end,
44
+
45
+ ListRules = Class.new(MCP::Tool) do
46
+ description "List the augure rules-as-data table: rule IDs, heads and " \
47
+ "documented sources. The single source of truth for " \
48
+ "technique applicability."
49
+ input_schema(properties: {})
50
+
51
+ class << self
52
+ def call(server_context: nil)
53
+ rows = ::Augure::Rules.all.map do |rule|
54
+ {id: rule.id, head: rule.head.join("="), source: rule.source}
55
+ end
56
+ MCP::Tool::Response.new([{type: "text", text: JSON.pretty_generate(rules: rows)}])
57
+ end
58
+ end
59
+ end,
60
+
61
+ ExplainTechnique = Class.new(MCP::Tool) do
62
+ description "Explain one technique: its rule conditions and documented " \
63
+ "knowledge-base entry (pattern, chain, unlocks, success rate)."
64
+ input_schema(
65
+ properties: {technique: {type: "string"}},
66
+ required: ["technique"]
67
+ )
68
+
69
+ class << self
70
+ def call(technique:, server_context: nil)
71
+ rules = ::Augure::Rules.all.select { |r| r.head == [::Augure::Rules::APPLICABLE, technique] }
72
+ entries = ::Augure::KnowledgeBase.corpus.select { |e| e["technique"] == technique }
73
+ MCP::Tool::Response.new([{type: "text", text: JSON.pretty_generate(
74
+ technique: technique,
75
+ rules: rules.map { |r| {id: r.id, source: r.source} },
76
+ knowledge: entries
77
+ )}])
78
+ end
79
+ end
80
+ end
81
+ ].freeze
82
+
83
+ def self.build
84
+ ::MCP::Server.new(name: "augure-mcp", version: "0.1.0", tools: TOOLS).tap do |server|
85
+ server.instructions = "augure is an auditable exploitation decision layer. " \
86
+ "Use analyze_target on fact files; every answer ships " \
87
+ "its rule provenance. Augure decides, it never executes."
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AugureMcp
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mcp"
4
+ require_relative "augure-mcp/version"
5
+ require_relative "augure-mcp/server"
6
+
7
+ module AugureMcp
8
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: augure-mcp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gregory Epp
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: augure
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: mcp
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.6'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.6'
40
+ description: 'Three read-only tools: analyze_target (facts in, decision + provenance
41
+ out), list_rules, explain_technique. The LLM proposes, augure disposes - the decision
42
+ layer every security agent can call.'
43
+ email:
44
+ - log0u7@users.noreply.github.com
45
+ executables:
46
+ - augure-mcp
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - "/home/runner/work/augure/augure/mcp_server/exe/augure-mcp"
51
+ - "/home/runner/work/augure/augure/mcp_server/lib/augure-mcp.rb"
52
+ - "/home/runner/work/augure/augure/mcp_server/lib/augure-mcp/server.rb"
53
+ - "/home/runner/work/augure/augure/mcp_server/lib/augure-mcp/version.rb"
54
+ - exe/augure-mcp
55
+ homepage: https://github.com/log0u7/augure
56
+ licenses:
57
+ - MIT
58
+ metadata:
59
+ homepage_uri: https://github.com/log0u7/augure
60
+ source_code_uri: https://github.com/log0u7/augure
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubygems_version: 3.6.9
76
+ specification_version: 4
77
+ summary: Read-only MCP server exposing the augure decision layer to LLM agents.
78
+ test_files: []