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 +7 -0
- data/exe/augure-mcp +7 -0
- data/home/runner/work/augure/augure/mcp_server/exe/augure-mcp +7 -0
- data/home/runner/work/augure/augure/mcp_server/lib/augure-mcp/server.rb +91 -0
- data/home/runner/work/augure/augure/mcp_server/lib/augure-mcp/version.rb +5 -0
- data/home/runner/work/augure/augure/mcp_server/lib/augure-mcp.rb +8 -0
- metadata +78 -0
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,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
|
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: []
|