@ieranama/discomcp 0.5.0 โ†’ 0.5.1

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.
package/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  # ๐Ÿชฉ DiscoMCP
4
4
 
5
- **Turn an unknown MCP into a reusable, workspace-aware operational skill for AI agents.**
5
+ **Your agent, meet your tools.**
6
+
7
+ Give any AI agent a real, safe understanding of the tools it connects to โ€” in one command.
6
8
 
7
9
  [![CI](https://github.com/ieranama/discomcp/actions/workflows/ci.yml/badge.svg)](https://github.com/ieranama/discomcp/actions/workflows/ci.yml)
8
10
  [![Release](https://img.shields.io/github/v/release/ieranama/discomcp?label=release)](https://github.com/ieranama/discomcp/releases)
@@ -11,189 +13,64 @@
11
13
 
12
14
  </div>
13
15
 
14
- No agent should walk onto the dance floor blind โ€” DiscoMCP checks the room, learns the moves, and only then cuts in.
15
-
16
- DiscoMCP turns an unknown Model Context Protocol (MCP) connection into a reusable, workspace-aware operational skill for AI agents.
17
-
18
- It connects to a target MCP, collects its declared capabilities and configured documentation, safely explores only permitted read or harmless computation paths, and produces a profile with a workspace-specific `SKILL.md`.
19
-
20
- DiscoMCP makes your agent be the one in the room you would like to dance with โ€” not the one who shows up, starts flailing at every button on the mixing desk, and calls it improvisation. It learns the playlist first, asks before it touches the decks, and never, ever pulls the fire alarm to see what happens.
16
+ Agents are great at code. They get lost inside your tools โ€” they don't know which of a hundred actions matter, how your data connects, or what's safe to touch. So they guess, or they freeze.
21
17
 
22
- ## Why DiscoMCP
18
+ DiscoMCP fixes that. Point it at any MCP server and it hands your agent a ready-made skill: what the server does, how it's actually used, and exactly what's safe โ€” learned by looking, and **without ever changing a thing**.
23
19
 
24
- An MCP tool catalogue alone does not explain how a particular user's accessible workspace is organized or which tool sequence solves a real task. DiscoMCP keeps the target catalogue internal, records evidence for every important claim, and generates an operational model that agents can use without guessing.
20
+ ## Why teams use it
25
21
 
26
- The result answers questions such as:
27
-
28
- - What does this MCP expose, and what platform or data source does it represent?
29
- - Which tools are safe to call during discovery, and which require explicit confirmation later?
30
- - Which structures, fields, identifiers, and relationships were actually observed?
31
- - What workflow should an agent follow to answer a user request safely?
32
- - What remains uncertain?
33
-
34
- ## Safety Contract
22
+ | | |
23
+ | --- | --- |
24
+ | ๐Ÿงญ **Agents that know their way around** | Your agent gets a map of the tool instead of guessing โ€” the sequences that answer real questions, and how one result leads to the next. |
25
+ | ๐Ÿ”’ **Read-only, guaranteed** | Exploring can never write. It runs a step only when it can *prove* that step is a read. Nothing is deleted or modified while it learns. |
26
+ | โšก **One command, zero setup** | A single 8 MB binary. No runtime, no toolchain โ€” `npx` and you're running. |
27
+ | ๐Ÿงฉ **Works with any MCP server** | Local or hosted. The same tool profiles your CRM, your data warehouse, or any API behind MCP. |
35
28
 
36
- DiscoMCP separates model reasoning from deterministic runtime control. A reasoning backend may propose a probe, but the runtime validates the target tool, JSON arguments, identifier provenance, policy, budgets, response limits, and redaction before any call is made.
29
+ ## Read-only, guaranteed
37
30
 
38
- During profiling, the runtime never automatically executes tools classified as:
31
+ This is the part that lets you actually turn an agent loose on a real system.
39
32
 
40
- - mutation
41
- - external side effect
42
- - destructive
43
- - administrative
44
- - arbitrary execution
45
- - unknown risk
33
+ DiscoMCP explores behind a **default-deny gate**: it runs an action only when it can prove that action is a read. A safe lookup runs. Anything that could write, change, or delete โ€” even if a tool *claims* it's harmless โ€” is refused. Secrets are stripped from everything it saves.
46
34
 
47
- Sensitive reads are additionally constrained by the configured privacy policy. Secrets are redacted before logs, persistence, generated artifacts, and reasoning-provider requests.
35
+ So your agent can learn your production tools without you holding your breath.
48
36
 
49
- ## Quick Start
37
+ ## Get started
50
38
 
51
- Run it with no install โ€” `npx` fetches the right prebuilt binary for your platform:
39
+ **1. Run it** โ€” no install needed:
52
40
 
53
41
  ```bash
54
42
  npx @ieranama/discomcp --help
55
43
  ```
56
44
 
57
- Or install the binary once (no Rust toolchain required):
58
-
59
- ```bash
60
- curl --proto '=https' --tlsv1.2 -LsSf https://github.com/ieranama/discomcp/releases/latest/download/discomcp-installer.sh | sh
61
- ```
62
-
63
- (Windows: `powershell -ExecutionPolicy Bypass -c "irm https://github.com/ieranama/discomcp/releases/latest/download/discomcp-installer.ps1 | iex"`. All platform archives are on the [releases page](https://github.com/ieranama/discomcp/releases).)
64
-
65
- Point a config at any MCP server you can run locally over stdio โ€” this is the whole file:
45
+ **2. Point it at a server** โ€” the whole config is a few lines:
66
46
 
67
47
  ```toml
68
48
  [targets.example]
69
49
  transport = "stdio"
70
50
  command = "npx"
71
- args = ["-y", "example-mcp"]
72
-
73
- [profiles]
74
- privacy_mode = "balanced"
51
+ args = ["-y", "some-mcp-server"]
75
52
  ```
76
53
 
77
- Then add DiscoMCP to your agent as a regular MCP server. Your agent is the brain; the DiscoMCP runtime enforces every safety check:
54
+ **3. Hand it to your agent** and let it explore:
78
55
 
79
56
  ```bash
80
- claude mcp add discomcp -- discomcp serve --config ./discomcp.toml
57
+ discomcp serve --config ./discomcp.toml
81
58
  ```
82
59
 
83
- The agent drives profiling through six tools โ€” `list_targets`, `lookup_target`, `inspect_target`, `execute_probe`, `finalize_profile`, `generate_skill` โ€” and the runtime validates every probe (risk class, argument schema, identifier provenance, budgets, redaction) before anything touches the target. Mutating, destructive, and administrative tools are always rejected during onboarding. `lookup_target` tells the agent whether a fresh skill already exists for the target's current catalogue, so exploration only runs when something actually changed.
84
-
85
- No agent connected? The standalone CLI does the same job with a configured reasoning backend (see [examples/config.toml](examples/config.toml)):
60
+ Your agent does the exploring; DiscoMCP keeps it safe and writes the skill. The result lands in `.discomcp/profiles/<server>/SKILL.md` โ€” ready to drop into your agent.
86
61
 
87
- ```bash
88
- discomcp profile example \
89
- --config ./examples/config.toml \
90
- --mode standard \
91
- --goal "Understand this MCP, safely explore my accessible workspace, and generate an operational skill"
92
- ```
93
-
94
- Profiles are written below `.discomcp/profiles/<target-id>/`. The canonical outputs are:
95
-
96
- - `capability-profile.json`
97
- - `workspace-model.json`
98
- - `operational-model.json`
99
-
100
- `SKILL.md` and `AGENTS.md` are generated exports of that canonical state.
101
-
102
- ## Configuration
103
-
104
- Start with [examples/config.toml](examples/config.toml). Targets are owned by DiscoMCP; it does not inherit servers from another agent host automatically. `stdio` launches a real MCP subprocess and communicates using newline-delimited JSON-RPC.
105
-
106
- ```toml
107
- [targets.example]
108
- transport = "stdio"
109
- command = "npx"
110
- args = ["-y", "example-mcp"]
111
- docs = ["./docs/example-mcp.md"]
112
-
113
- [targets.example.env]
114
- EXAMPLE_API_KEY = "${EXAMPLE_API_KEY}"
115
-
116
- [reasoning]
117
- routing = "single"
118
- everyday_backend = "primary"
119
-
120
- [reasoning.backends.primary]
121
- type = "command"
122
- command = "some-agent-cli"
123
- args = ["exec", "--model", "{model}"]
124
- model = "your-configured-model"
125
- input = "stdin_json"
126
- output = "stdout_json"
127
- ```
62
+ ## Under the hood
128
63
 
129
- The command receives one serialized `ReasoningRequest` on stdin and must emit either a `ReasoningResponse` JSON object or the raw JSON value for its `output` on stdout. No target credentials or unredacted MCP response are interpolated into the command line.
130
-
131
- Environment interpolation fails clearly when a required variable is missing and never prints the resolved secret. Do not commit credentials, profile output containing sensitive workspace material, or `.env` files.
132
-
133
- ## Evidence
134
-
135
- Every material claim in a generated profile carries one of these statuses:
136
-
137
- | Status | Meaning |
138
- | --- | --- |
139
- | `declared` | Exposed directly through MCP metadata, schemas, or annotations. |
140
- | `documented` | Found in configured or MCP-exposed documentation. |
141
- | `observed` | Confirmed by a successful permitted MCP call. |
142
- | `inferred` | Reasoned from declarations, documentation, and observations. |
143
- | `user_defined` | Explicitly supplied by the user. |
144
- | `unknown` | Insufficient evidence. |
145
- | `contradicted` | Relevant sources disagree. |
146
-
147
- Inferences include their confidence, supporting evidence, source references, and contradictions. DiscoMCP does not present an inferred relationship as an observed fact.
148
-
149
- ## Development
150
-
151
- Want to contribute, or run an unreleased change? Build from source instead of installing the binary.
152
-
153
- Prerequisites: Rust stable with `rustfmt` and `clippy`, and `cargo-audit` for the full local quality gate.
154
-
155
- ```bash
156
- git clone https://github.com/ieranama/discomcp.git
157
- cd discomcp
158
- cargo run -p discomcp -- profile example --config ./examples/config.toml --mode standard --goal "..."
159
- ```
160
-
161
- Run the local quality gate before opening a pull request:
162
-
163
- ```bash
164
- cargo fmt --check
165
- cargo clippy --all-targets --all-features -- -D warnings
166
- cargo test --all
167
- cargo audit
168
- ```
169
-
170
- Install the audit tool once if needed:
171
-
172
- ```bash
173
- cargo install cargo-audit --locked
174
- ```
175
-
176
- The repository includes a generic collection-oriented mock MCP fixture so tests do not require credentials or external services.
177
-
178
- ## Documentation
64
+ Built in Rust: the model does the thinking, a small deterministic core enforces every safety check. Every claim in a generated skill is tagged with how it was known โ€” declared, documented, observed, or inferred โ€” so an agent never mistakes a guess for a fact.
179
65
 
180
66
  - [Architecture](docs/ARCHITECTURE.md)
181
67
  - [Threat model](docs/THREAT_MODEL.md)
182
68
  - [Extension guide](docs/EXTENDING.md)
183
- - [Contributing](CONTRIBUTING.md)
184
- - [Security policy](SECURITY.md)
185
-
186
- ## Contributing
187
-
188
- See [CONTRIBUTING.md](CONTRIBUTING.md). By participating, you agree to follow the [Code of Conduct](CODE_OF_CONDUCT.md).
69
+ - [Configuration example](examples/config.toml)
70
+ - [Contributing](CONTRIBUTING.md) ยท [Security policy](SECURITY.md)
189
71
 
190
72
  ## License
191
73
 
192
- Licensed under either of
193
-
194
- - [Apache License, Version 2.0](LICENSE-APACHE)
195
- - [MIT License](LICENSE-MIT)
196
-
197
- at your option.
74
+ Licensed under either of [Apache License, Version 2.0](LICENSE-APACHE) or [MIT License](LICENSE-MIT) at your option.
198
75
 
199
76
  Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in DiscoMCP by you, as defined in the Apache-2.0 license, shall be dual-licensed as above, without any additional terms or conditions.
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT OR Apache-2.0",
21
21
  "name": "@ieranama/discomcp",
22
- "version": "0.5.0"
22
+ "version": "0.5.1"
23
23
  },
24
24
  "node_modules/detect-libc": {
25
25
  "engines": {
@@ -48,5 +48,5 @@
48
48
  }
49
49
  },
50
50
  "requires": true,
51
- "version": "0.5.0"
51
+ "version": "0.5.1"
52
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/ieranama/discomcp/releases/download/v0.5.0"
3
+ "https://github.com/ieranama/discomcp/releases/download/v0.5.1"
4
4
  ],
5
5
  "bin": {
6
6
  "discomcp": "run-discomcp.js"
@@ -80,7 +80,7 @@
80
80
  "zipExt": ".tar.xz"
81
81
  }
82
82
  },
83
- "version": "0.5.0",
83
+ "version": "0.5.1",
84
84
  "volta": {
85
85
  "node": "18.14.1",
86
86
  "npm": "9.5.0"