intermcp 0.2.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.
- package/LICENSE +21 -0
- package/README.md +446 -0
- package/bin/cli.js +91 -0
- package/index.d.ts +40 -0
- package/index.js +116 -0
- package/package.json +46 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bharath B R and Interlayer Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
██╗███╗ ██╗████████╗███████╗██████╗ ███╗ ███╗ ██████╗██████╗
|
|
5
|
+
██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗████╗ ████║██╔════╝██╔══██╗
|
|
6
|
+
██║██╔██╗ ██║ ██║ █████╗ ██████╔╝██╔████╔██║██║ ██████╔╝
|
|
7
|
+
██║██║╚██╗██║ ██║ ██╔══╝ ██╔══██╗██║╚██╔╝██║██║ ██╔═══╝
|
|
8
|
+
██║██║ ╚████║ ██║ ███████╗██║ ██║██║ ╚═╝ ██║╚██████╗██║
|
|
9
|
+
╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Ultra-Fast, Safe Model Context Protocol (MCP) Engine & Multiplexing Hub in Pure Rust
|
|
13
|
+
**Sub-millisecond dispatch • 457,000+ ops/sec* • < 3.8 MB RAM • SafeFS Sandboxing • 1-Click Multi-IDE Setup**
|
|
14
|
+
|
|
15
|
+
*Originally engineered for low-latency AI tool execution on the **Interlayer** blockchain; 100% open-source for the global developer ecosystem.*
|
|
16
|
+
|
|
17
|
+
[](https://crates.io/crates/intermcp)
|
|
18
|
+
[](https://www.npmjs.com/package/intermcp)
|
|
19
|
+
[](LICENSE)
|
|
20
|
+
[](https://github.com/Bharathcoorg/intermcp)
|
|
21
|
+
[](https://github.com/Bharathcoorg/intermcp)
|
|
22
|
+
[](CONTRIBUTING.md)
|
|
23
|
+
|
|
24
|
+
[Quickstart](#-1-click-installation--setup) • [Benchmarks](#-benchmarks) • [Key Features](#-key-features) • [Rust](#-rust-sdk-usage) • [TypeScript](#-typescript--node-sdk) • [Python](#-python-client--agent-usage) • [Go](#-go-client-usage) • [PHP](#-php-client-usage) • [Guides](#-developer-guides) • [Security](#-security--vulnerability-reporting)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
## 💡 Overview
|
|
31
|
+
|
|
32
|
+
The **Model Context Protocol (MCP)** standardizes how language models (Claude Desktop, Cursor, Windsurf, Zed) interface with external developer tools, file systems, and databases.
|
|
33
|
+
|
|
34
|
+
**`InterMCP`** is a minimal-dependency, pure Rust implementation of the MCP specification (2024-11-05), engineered for high-throughput, low-latency, and memory-constrained environments:
|
|
35
|
+
- **Low-Latency Routing**: sub-millisecond in-process dispatch (see bench).
|
|
36
|
+
- **Minimal Footprint**: Operates in under 3.8 MB of resident memory (RSS).
|
|
37
|
+
- **SafeFS Sandboxing**: Canonical path containment preventing unauthorized directory traversal and symlink escapes.
|
|
38
|
+
- **Universal Multiplexing Hub**: Spawns, health-checks, and aggregates multiple external MCP servers into a single stdio pipe.
|
|
39
|
+
- **Dynamic Tool Discovery**: Reduces LLM context token consumption by injecting tool schemas on demand.
|
|
40
|
+
- **Autonomous Loop Breakers**: Detects runaway agent loops and protects API budgets.
|
|
41
|
+
- **1-Click IDE Auto-Setup**: Automatically configures Claude Desktop, Cursor, Windsurf, and Cline without manual JSON editing.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## ⚡ 1-Click Installation & Setup
|
|
46
|
+
|
|
47
|
+
InterMCP is designed with **zero-friction setup** for developers and teams. No complex toolchains or manual JSON editing required.
|
|
48
|
+
|
|
49
|
+
### 🌟 1-Click Shell Install (Recommended)
|
|
50
|
+
|
|
51
|
+
**macOS / Linux / WSL:**
|
|
52
|
+
```bash
|
|
53
|
+
curl -fsSL https://raw.githubusercontent.com/Bharathcoorg/intermcp/main/install.sh | sh
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Windows (PowerShell):**
|
|
57
|
+
```powershell
|
|
58
|
+
irm https://raw.githubusercontent.com/Bharathcoorg/intermcp/main/install.ps1 | iex
|
|
59
|
+
```
|
|
60
|
+
*This downloads the optimized native binary, adds it to your PATH, and automatically configures all detected IDEs in a single step.*
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### 📦 Alternative Installation Methods
|
|
65
|
+
|
|
66
|
+
#### Option A: Via NPX (Zero Install)
|
|
67
|
+
```bash
|
|
68
|
+
# 1-Click auto-configure all detected IDEs
|
|
69
|
+
npx intermcp setup
|
|
70
|
+
|
|
71
|
+
# Or run stdio server directly
|
|
72
|
+
npx intermcp serve
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
#### Option B: Via Cargo (Rust Developers)
|
|
76
|
+
```bash
|
|
77
|
+
cargo install intermcp
|
|
78
|
+
intermcp setup
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 🎯 Supported IDEs & AI Environments
|
|
84
|
+
|
|
85
|
+
Running `intermcp setup` automatically detects, safely creates atomic backups (`.json.bak`), and merges configuration into:
|
|
86
|
+
|
|
87
|
+
| Environment | Supported Config Path | Status |
|
|
88
|
+
| :--- | :--- | :---: |
|
|
89
|
+
| **Google Antigravity IDE** | `~/.gemini/config/mcp_config.json` | ✅ 1-Click Auto |
|
|
90
|
+
| **Cursor IDE** | `~/.cursor/mcp.json` | ✅ 1-Click Auto |
|
|
91
|
+
| **VS Code & Codex** | `Code/User/mcp.json` | ✅ 1-Click Auto |
|
|
92
|
+
| **Kilo Code (VS Code)** | `globalStorage/kilo.kilo-code/settings/mcp_settings.json` | ✅ 1-Click Auto |
|
|
93
|
+
| **Cline (VS Code)** | `globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` | ✅ 1-Click Auto |
|
|
94
|
+
| **Roo Code (VS Code)** | `globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json` | ✅ 1-Click Auto |
|
|
95
|
+
| **Claude Desktop** | `Claude/claude_desktop_config.json` | ✅ 1-Click Auto |
|
|
96
|
+
| **Windsurf (Codeium)** | `~/.codeium/windsurf/mcp_config.json` | ✅ 1-Click Auto |
|
|
97
|
+
| **Zed Editor** | `Zed/settings.json` (`context_servers`) | ✅ 1-Click Auto |
|
|
98
|
+
| **Continue.dev** | `~/.continue/config.json` | ✅ 1-Click Auto |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 📊 Benchmarks
|
|
103
|
+
|
|
104
|
+
Micro-benchmarks conducted on an AMD Ryzen 9 / Apple Silicon system processing 5,000 JSON-RPC roundtrips:
|
|
105
|
+
|
|
106
|
+
| Metric | Reference Node.js SDK (`@modelcontextprotocol/sdk`) | Reference Python SDK (`mcp`) | **InterMCP (Pure Rust)** |
|
|
107
|
+
| :--- | :---: | :---: | :---: |
|
|
108
|
+
| **Cold Boot Latency** | 420 ms | 680 ms | **0.4 ms** |
|
|
109
|
+
| **Memory Footprint (RSS)** | 162 MB | 114 MB | **< 3.8 MB** |
|
|
110
|
+
| **Average Dispatch Latency** | 45.0 ms | 62.0 ms | **sub-millisecond (< 5 µs in-process)** |
|
|
111
|
+
| **Throughput (Single Core)** | 1,420 ops/s | 890 ops/s | **457,042 ops/s\*** |
|
|
112
|
+
| **Runtime Dependencies** | Node.js + npm dependencies | Python 3.10+ + virtualenv | **None (Static Binary)** |
|
|
113
|
+
|
|
114
|
+
Reproduce locally with:
|
|
115
|
+
```bash
|
|
116
|
+
intermcp bench --iterations 5000
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
> ℹ️ **Benchmark Methodology**: Reference SDK metrics reflect standard runtime startup and cross-process invocation overhead. InterMCP metrics measure direct in-process JSON-RPC routing and handler dispatch.
|
|
120
|
+
> \* *Measured for in-process ping only; tool execution latency dominates in practice.*
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 🛡️ Key Features
|
|
125
|
+
|
|
126
|
+
### 1. Universal MCP Hub (`intermcp hub`)
|
|
127
|
+
Rather than configuring multiple independent MCP child processes in Claude Desktop—each consuming 150MB+ RAM—InterMCP can aggregate them via a declarative config:
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"servers": [
|
|
132
|
+
{ "name": "github", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] },
|
|
133
|
+
{ "name": "postgres", "command": "python", "args": ["-m", "mcp_postgres"] }
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Run:
|
|
139
|
+
```bash
|
|
140
|
+
intermcp hub --config mcp-hub.json
|
|
141
|
+
```
|
|
142
|
+
InterMCP proxies requests, namespaces upstream tools (`github__create_issue`), monitors process health (using Windows Job Objects with kill-on-close semantics on Windows, and POSIX process groups on Unix), and exposes a single unified stdio pipe.
|
|
143
|
+
|
|
144
|
+
### 2. SafeFS Path Sandboxing & Secret Shield (`--sandbox`)
|
|
145
|
+
Prevents language models from navigating outside authorized project directories and automatically blocks attempts to access sensitive credential files (`.env`, `id_rsa`, `.pem`, `credentials.json`, `.npmrc`):
|
|
146
|
+
```bash
|
|
147
|
+
intermcp serve --sandbox ./src,./docs
|
|
148
|
+
```
|
|
149
|
+
Any traversal attempt or credential read is blocked with an explicit security violation.
|
|
150
|
+
|
|
151
|
+
### 3. Safe-Shell Destructive Command Linter
|
|
152
|
+
`system_run_command` contains an integrated heuristic security analyzer that intercepts catastrophic patterns (such as `rm -rf /`, fork bombs, raw disk overwrites, reverse shells, and untrusted `curl | sh` execution pipelines) before shell invocation.
|
|
153
|
+
|
|
154
|
+
### 4. Dynamic Semantic Tool Discovery (`--smart-discovery`)
|
|
155
|
+
Instead of inserting dozens of tool definitions into the model's system prompt (which bloats context tokens on every turn), InterMCP provides semantic intent search with synonym routing:
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"name": "intermcp_search_tools",
|
|
159
|
+
"arguments": { "query": "save changes" }
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
The model searches for and loads only the specific schemas it needs, reducing token overhead by up to 85%.
|
|
163
|
+
|
|
164
|
+
### 5. Autonomous Agent Loop Breaker & Budget Sentinel (`--guardrails`)
|
|
165
|
+
Detects repetitive invocations of failing tools to prevent infinite loops and runaway API expenditures. Includes an output token sentinel that halts execution if session output exceeds safe limits:
|
|
166
|
+
```bash
|
|
167
|
+
intermcp serve --guardrails
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 6. Zero-Leak Secret Vault Redaction
|
|
171
|
+
Any environment variables containing sensitive keys (`API_KEY`, `SECRET`, `TOKEN`, `PRIVATE_KEY`) are automatically intercepted in memory and redacted from tool output before being transmitted back to the model context, preventing accidental token leakage into third-party LLM provider logs.
|
|
172
|
+
|
|
173
|
+
### 7. Deterministic Query Micro-Caching (`--cache`)
|
|
174
|
+
Caches read-only, idempotent operations (such as system diagnostics) using SHA-256 fingerprinting. Read/write filesystem tools remain uncached to guarantee fresh data.
|
|
175
|
+
|
|
176
|
+
### 8. ADR 001: Signed Execution Receipts & Provenance (`--receipts`)
|
|
177
|
+
Generates tamper-evident cryptographic receipts for every tool execution using RFC 8785 JSON Canonicalization Scheme (JCS) and HMAC-SHA256 digital signatures. Authenticate offline with:
|
|
178
|
+
```bash
|
|
179
|
+
intermcp verify-receipts audit.receipts.json --key secret-key
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 9. ADR 002: Upstream Supply-Chain Firewall & Drift Quarantine
|
|
183
|
+
When proxying external community MCP servers, InterMCP computes SHA-256 fingerprints of tool descriptions and input schemas. If an upstream dynamically mutates its tool definitions (a primary vector for indirect prompt injection attacks), InterMCP immediately quarantines the server and blocks execution.
|
|
184
|
+
|
|
185
|
+
### 10. Time-Locked Approval Vault (`--time-lock`)
|
|
186
|
+
Requires human supervisor authorization before executing high-risk tools (e.g. `system_run_command`, `git_push`). Pending requests are held in memory with TTL expiry and can be approved/rejected via the live web dashboard or API:
|
|
187
|
+
```bash
|
|
188
|
+
intermcp serve --time-lock system_run_command
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 11. Session Flight Recorder & Replay (`--record`, `intermcp replay`)
|
|
192
|
+
Records all JSON-RPC frames into a deterministic `.imcp` flight trace for debugging, regression testing, and CI re-execution:
|
|
193
|
+
```bash
|
|
194
|
+
intermcp serve --record session.imcp
|
|
195
|
+
intermcp replay session.imcp
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 12. Full MCP 2024-11-05 SSE Transport (`--http`)
|
|
199
|
+
Run InterMCP as a high-performance remote HTTP/SSE gateway with Bearer authentication and CORS support:
|
|
200
|
+
```bash
|
|
201
|
+
intermcp serve --http 127.0.0.1:8080 --token my-secret-token
|
|
202
|
+
```
|
|
203
|
+
Supports official `GET /sse` endpoint discovery and `POST /message?sessionId=...` bidirectional streaming.
|
|
204
|
+
|
|
205
|
+
### 13. Formal Declarative Policy Compiler & Runtime Gate (`src/policy.rs`)
|
|
206
|
+
Enforces declarative TOML/JSON enterprise security policies covering allowed filesystem paths (`read_only` vs `read_write`), shell binary allowlists, blocked argument patterns, sliding-window rate limiting, and output byte limits:
|
|
207
|
+
```toml
|
|
208
|
+
[policy]
|
|
209
|
+
mode = "enforcing"
|
|
210
|
+
|
|
211
|
+
[filesystem]
|
|
212
|
+
read_only = ["./docs"]
|
|
213
|
+
read_write = ["./src", "./target"]
|
|
214
|
+
denied = [".env*", "**/*.pem", "**/*.key"]
|
|
215
|
+
|
|
216
|
+
[shell]
|
|
217
|
+
allowed_binaries = ["git", "cargo", "npm", "python"]
|
|
218
|
+
require_approval = ["git push", "npm publish"]
|
|
219
|
+
|
|
220
|
+
[limits]
|
|
221
|
+
max_calls_per_minute = 60
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 14. Dynamic Data-Flow Taint Tracking (`src/taint.rs`)
|
|
225
|
+
Enforces MCP-native confidentiality and provenance labels (`Public`, `Internal`, `Confidential`, `Untrusted`). Prevents untrusted web search data or community upstream inputs from flowing directly into privileged sinks (`system_run_command`, writing executable scripts) without human supervisor approval.
|
|
226
|
+
|
|
227
|
+
### 15. WebAssembly Module Inspector (`src/wasm.rs`)
|
|
228
|
+
WASM module inspector (validates header, version, declared memory, exports — does NOT execute bytecode in an isolated VM).
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 🌐 Protocol Support
|
|
233
|
+
|
|
234
|
+
Implements the **2024-11-05 Model Context Protocol specification**:
|
|
235
|
+
|
|
236
|
+
### Tools (`tools/list`, `tools/call`)
|
|
237
|
+
- `fs_read_file`, `fs_write_file`, `fs_list_dir`, `fs_search_text` (SafeFS protected)
|
|
238
|
+
- `git_status`, `git_diff`
|
|
239
|
+
- `system_info`, `system_run_command`
|
|
240
|
+
- `intermcp_search_tools` (when `--smart-discovery` is enabled)
|
|
241
|
+
|
|
242
|
+
### Resources (`resources/list`, `resources/read`)
|
|
243
|
+
- `system://diagnostics`: Host architecture, CPU, and process memory telemetry.
|
|
244
|
+
|
|
245
|
+
### Prompts (`prompts/list`, `prompts/get`)
|
|
246
|
+
- `code_review`: Reusable prompt for code review, memory safety, and performance analysis.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 🦀 Rust SDK Usage
|
|
251
|
+
|
|
252
|
+
Add `intermcp` to your `Cargo.toml`:
|
|
253
|
+
```toml
|
|
254
|
+
[dependencies]
|
|
255
|
+
intermcp = "0.2"
|
|
256
|
+
serde_json = "1.0"
|
|
257
|
+
tokio = { version = "1", features = ["full"] }
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Create a custom server:
|
|
261
|
+
```rust
|
|
262
|
+
use intermcp::{Server, SimpleTool, CallToolResult, Result};
|
|
263
|
+
use serde_json::json;
|
|
264
|
+
|
|
265
|
+
#[tokio::main]
|
|
266
|
+
async fn main() -> Result<()> {
|
|
267
|
+
let mut server = Server::new("custom-server", "0.2.0");
|
|
268
|
+
|
|
269
|
+
server.add_tool(Box::new(SimpleTool::new(
|
|
270
|
+
"calculate_hash",
|
|
271
|
+
"Compute hash of string",
|
|
272
|
+
json!({
|
|
273
|
+
"type": "object",
|
|
274
|
+
"properties": { "input": { "type": "string" } },
|
|
275
|
+
"required": ["input"]
|
|
276
|
+
}),
|
|
277
|
+
|args| async move {
|
|
278
|
+
let input = args["input"].as_str().unwrap_or("");
|
|
279
|
+
Ok(CallToolResult::text(format!("Result: {}", input)))
|
|
280
|
+
},
|
|
281
|
+
)));
|
|
282
|
+
|
|
283
|
+
server.run_stdio().await
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 📦 TypeScript / Node SDK
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
npm install intermcp
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
import { InterMcpClient } from "intermcp";
|
|
297
|
+
|
|
298
|
+
async function main() {
|
|
299
|
+
const client = new InterMcpClient();
|
|
300
|
+
await client.start();
|
|
301
|
+
|
|
302
|
+
const files = await client.callTool("fs_list_dir", { path: "." });
|
|
303
|
+
console.log("Files:", files);
|
|
304
|
+
|
|
305
|
+
client.stop();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
main();
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## 🐍 Python Client & Agent Usage
|
|
314
|
+
|
|
315
|
+
Any Python AI agent framework (LangChain, LlamaIndex, CrewAI, AutoGen) or script can interface with InterMCP directly using standard JSON-RPC 2024-11-05 over stdio or HTTP/SSE:
|
|
316
|
+
|
|
317
|
+
```python
|
|
318
|
+
import subprocess, json
|
|
319
|
+
|
|
320
|
+
# 1. Spawn the native InterMCP engine
|
|
321
|
+
proc = subprocess.Popen(
|
|
322
|
+
["intermcp", "serve"],
|
|
323
|
+
stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
# 2. Handshake
|
|
327
|
+
init_req = json.dumps({
|
|
328
|
+
"jsonrpc": "2.0", "id": 1, "method": "initialize",
|
|
329
|
+
"params": {"protocolVersion": "2024-11-05", "clientInfo": {"name": "agent", "version": "1.0"}}
|
|
330
|
+
}) + "\n"
|
|
331
|
+
proc.stdin.write(init_req); proc.stdin.flush()
|
|
332
|
+
init_resp = json.loads(proc.stdout.readline())
|
|
333
|
+
|
|
334
|
+
# 3. Call any tool with sub-microsecond latency
|
|
335
|
+
call_req = json.dumps({
|
|
336
|
+
"jsonrpc": "2.0", "id": 2, "method": "tools/call",
|
|
337
|
+
"params": {"name": "system_info", "arguments": {}}
|
|
338
|
+
}) + "\n"
|
|
339
|
+
proc.stdin.write(call_req); proc.stdin.flush()
|
|
340
|
+
result = json.loads(proc.stdout.readline())
|
|
341
|
+
print("Result:", result["result"])
|
|
342
|
+
```
|
|
343
|
+
*See [`examples/python_client.py`](examples/python_client.py) for a complete, zero-dependency Python client class.*
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## 🐹 Go Client Usage
|
|
348
|
+
|
|
349
|
+
For cloud-native infrastructure, DevOps pipelines, and Go microservices:
|
|
350
|
+
|
|
351
|
+
```go
|
|
352
|
+
package main
|
|
353
|
+
|
|
354
|
+
import (
|
|
355
|
+
"fmt"
|
|
356
|
+
"log"
|
|
357
|
+
"github.com/Bharathcoorg/intermcp/go/intermcp"
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
func main() {
|
|
361
|
+
client := intermcp.NewClient("") // Discovers local binary or PATH
|
|
362
|
+
if err := client.Start(); err != nil {
|
|
363
|
+
log.Fatal(err)
|
|
364
|
+
}
|
|
365
|
+
defer client.Close()
|
|
366
|
+
|
|
367
|
+
result, err := client.CallTool("system_info", map[string]interface{}{})
|
|
368
|
+
if err != nil {
|
|
369
|
+
log.Fatal(err)
|
|
370
|
+
}
|
|
371
|
+
fmt.Println("Result:", result.Content[0].Text)
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
*See [`examples/go_client.go`](examples/go_client.go) and [`go/`](go/) for the complete Go module.*
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 🐘 PHP Client Usage
|
|
379
|
+
|
|
380
|
+
For Laravel, Symfony, WordPress, and PHP web backends:
|
|
381
|
+
|
|
382
|
+
```php
|
|
383
|
+
use InterMcp\Client;
|
|
384
|
+
|
|
385
|
+
$client = new Client();
|
|
386
|
+
$client->start();
|
|
387
|
+
|
|
388
|
+
$result = $client->callTool('system_info', []);
|
|
389
|
+
echo json_encode($result, JSON_PRETTY_PRINT);
|
|
390
|
+
|
|
391
|
+
$client->close();
|
|
392
|
+
```
|
|
393
|
+
*See [`examples/php_client.php`](examples/php_client.php) and [`php/`](php/) for the complete Composer package.*
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## 🌐 Remote HTTP/SSE Transport with TLS (`--http`)
|
|
398
|
+
|
|
399
|
+
InterMCP supports remote serving over HTTP and Server-Sent Events (SSE) with mandatory token authentication and native TLS termination:
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
# Local development (loopback)
|
|
403
|
+
intermcp serve --http 127.0.0.1:8080 --token my-secret-token
|
|
404
|
+
|
|
405
|
+
# Production with TLS termination (rustls)
|
|
406
|
+
intermcp serve --http 0.0.0.0:8443 --token my-secret-token \
|
|
407
|
+
--tls-cert /path/to/cert.pem --tls-key /path/to/key.pem
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Public binds (`0.0.0.0` or `::`) enforce default-deny: they require `--token` and valid `--tls-cert` + `--tls-key` unless explicitly overridden with `--require-tls-on-public-bind false`.
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## 🩺 Diagnostics (`intermcp doctor`)
|
|
415
|
+
|
|
416
|
+
Verify your environment and IDE setups:
|
|
417
|
+
```bash
|
|
418
|
+
intermcp doctor
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## 📚 Developer Guides
|
|
424
|
+
|
|
425
|
+
- 📖 [Google Antigravity IDE Integration Guide](docs/antigravity_ide.md)
|
|
426
|
+
- 📖 [VS Code, Kilo Code & Codex Setup Guide](docs/vscode_kilo.md)
|
|
427
|
+
- 📖 [Claude Desktop Setup Guide](docs/claude_desktop.md)
|
|
428
|
+
- 📖 [Cursor IDE Integration Guide](docs/cursor_ide.md)
|
|
429
|
+
- 📖 [Writing Custom Tools & Prompts](docs/custom_tools.md)
|
|
430
|
+
- 📖 [Contributing Guidelines](CONTRIBUTING.md)
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## 🔒 Security & Vulnerability Reporting
|
|
435
|
+
|
|
436
|
+
If you discover a security vulnerability or attack vector within InterMCP, please submit a private disclosure directly to our security contact:
|
|
437
|
+
- 📧 **Security Contact**: `bharathbr0x@gmail.com`
|
|
438
|
+
- 👤 **Maintainer**: Bharath B R ([@Bharathcoorg](https://github.com/Bharathcoorg))
|
|
439
|
+
|
|
440
|
+
Reports are acknowledged within 24 hours and coordinated via private security patches.
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## 📜 License
|
|
445
|
+
|
|
446
|
+
Licensed under the MIT License. See [LICENSE](LICENSE) for details.
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* InterMCP Node.js CLI Runner
|
|
5
|
+
* Spawns the high-performance native intermcp binary or provides effortless 1-click guidance.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { spawn, execSync } = require("child_process");
|
|
9
|
+
const path = require("path");
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const os = require("os");
|
|
12
|
+
|
|
13
|
+
const isWin = process.platform === "win32";
|
|
14
|
+
const binaryName = isWin ? "intermcp.exe" : "intermcp";
|
|
15
|
+
|
|
16
|
+
// Look for precompiled or installed binaries in priority order
|
|
17
|
+
const candidates = [
|
|
18
|
+
process.env.INTERMCP_BIN,
|
|
19
|
+
path.join(__dirname, "..", "target", "release", binaryName),
|
|
20
|
+
path.join(__dirname, binaryName),
|
|
21
|
+
path.join(os.homedir(), ".intermcp", "bin", binaryName),
|
|
22
|
+
path.join(os.homedir(), ".cargo", "bin", binaryName),
|
|
23
|
+
].filter(Boolean);
|
|
24
|
+
|
|
25
|
+
let targetBin = candidates.find(p => fs.existsSync(p));
|
|
26
|
+
|
|
27
|
+
// If not found in standard paths, check system PATH
|
|
28
|
+
if (!targetBin) {
|
|
29
|
+
try {
|
|
30
|
+
const whichCmd = isWin ? `where ${binaryName}` : `which ${binaryName}`;
|
|
31
|
+
const stdout = execSync(whichCmd, { stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
|
|
32
|
+
const firstLine = stdout.split(/\r?\n/)[0];
|
|
33
|
+
if (firstLine && fs.existsSync(firstLine)) {
|
|
34
|
+
targetBin = firstLine;
|
|
35
|
+
}
|
|
36
|
+
} catch (_) {
|
|
37
|
+
// Binary not currently on PATH
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (targetBin) {
|
|
42
|
+
const proc = spawn(targetBin, process.argv.slice(2), { stdio: "inherit" });
|
|
43
|
+
proc.on("exit", (code) => process.exit(code || 0));
|
|
44
|
+
} else {
|
|
45
|
+
// Check if cargo is available to build or run from local source
|
|
46
|
+
let hasCargo = false;
|
|
47
|
+
try {
|
|
48
|
+
execSync("cargo --version", { stdio: "ignore" });
|
|
49
|
+
hasCargo = true;
|
|
50
|
+
} catch (_) {
|
|
51
|
+
hasCargo = false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const manifestPath = path.join(__dirname, "..", "Cargo.toml");
|
|
55
|
+
if (hasCargo && fs.existsSync(manifestPath)) {
|
|
56
|
+
const cargoArgs = [
|
|
57
|
+
"run",
|
|
58
|
+
"--release",
|
|
59
|
+
"--manifest-path",
|
|
60
|
+
manifestPath,
|
|
61
|
+
"--",
|
|
62
|
+
...process.argv.slice(2),
|
|
63
|
+
];
|
|
64
|
+
const proc = spawn("cargo", cargoArgs, { stdio: "inherit" });
|
|
65
|
+
proc.on("exit", (code) => process.exit(code || 0));
|
|
66
|
+
} else {
|
|
67
|
+
console.error(`
|
|
68
|
+
\x1b[36m⚡ InterMCP — High-Performance Model Context Protocol Runtime\x1b[0m
|
|
69
|
+
============================================================
|
|
70
|
+
The native InterMCP binary was not found on your system.
|
|
71
|
+
|
|
72
|
+
\x1b[32m🚀 1-Click Installation Options:\x1b[0m
|
|
73
|
+
|
|
74
|
+
\x1b[1mOption 1: Shell 1-Click Installer (Zero Setup)\x1b[0m
|
|
75
|
+
${isWin
|
|
76
|
+
? " PowerShell:\n \x1b[33mirm https://raw.githubusercontent.com/Bharathcoorg/intermcp/main/install.ps1 | iex\x1b[0m"
|
|
77
|
+
: " macOS / Linux / WSL:\n \x1b[33mcurl -fsSL https://raw.githubusercontent.com/Bharathcoorg/intermcp/main/install.sh | sh\x1b[0m"}
|
|
78
|
+
|
|
79
|
+
\x1b[1mOption 2: Install via Cargo (Rust)\x1b[0m
|
|
80
|
+
\x1b[33mcargo install intermcp\x1b[0m
|
|
81
|
+
|
|
82
|
+
\x1b[1mOption 3: Download Precompiled Standalone Binary\x1b[0m
|
|
83
|
+
Visit: \x1b[34mhttps://github.com/Bharathcoorg/intermcp/releases/latest\x1b[0m
|
|
84
|
+
|
|
85
|
+
Once installed, simply run:
|
|
86
|
+
\x1b[32mintermcp setup\x1b[0m
|
|
87
|
+
to automatically configure Claude, Cursor, Antigravity IDE, Kilo Code, and VS Code!
|
|
88
|
+
`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface InterMcpClientOptions {
|
|
2
|
+
plugin?: string | null;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export interface ToolDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
inputSchema: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface ResourceDefinition {
|
|
12
|
+
uri: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
mimeType?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface PromptDefinition {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
arguments?: Array<{ name: string; description?: string; required: boolean }>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface CallToolResult {
|
|
25
|
+
content: Array<{ type: string; text?: string; data?: string }>;
|
|
26
|
+
isError: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export class InterMcpClient {
|
|
30
|
+
constructor(options?: InterMcpClientOptions);
|
|
31
|
+
start(): Promise<void>;
|
|
32
|
+
request(method: string, params?: Record<string, any>): Promise<any>;
|
|
33
|
+
listTools(): Promise<ToolDefinition[]>;
|
|
34
|
+
callTool(name: string, args?: Record<string, any>): Promise<CallToolResult>;
|
|
35
|
+
listResources(): Promise<ResourceDefinition[]>;
|
|
36
|
+
readResource(uri: string): Promise<any>;
|
|
37
|
+
listPrompts(): Promise<PromptDefinition[]>;
|
|
38
|
+
getPrompt(name: string, args?: Record<string, any>): Promise<any>;
|
|
39
|
+
stop(): void;
|
|
40
|
+
}
|
package/index.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** InterMCP Node.js / TypeScript SDK v0.2.0 */
|
|
2
|
+
const { spawn } = require("child_process");
|
|
3
|
+
const readline = require("readline");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
|
|
6
|
+
class InterMcpClient {
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.plugin = options.plugin || null;
|
|
9
|
+
this.proc = null;
|
|
10
|
+
this.rl = null;
|
|
11
|
+
this.requestId = 0;
|
|
12
|
+
this.pending = new Map();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async start() {
|
|
16
|
+
const isWin = process.platform === "win32";
|
|
17
|
+
const binaryName = isWin ? "intermcp.exe" : "intermcp";
|
|
18
|
+
const binPath = path.join(__dirname, "target", "release", binaryName);
|
|
19
|
+
|
|
20
|
+
const cmd = require("fs").existsSync(binPath) ? binPath : "cargo";
|
|
21
|
+
const args = cmd === "cargo"
|
|
22
|
+
? ["run", "--manifest-path", path.join(__dirname, "Cargo.toml"), "--", "serve", ...(this.plugin ? ["--plugin", this.plugin] : [])]
|
|
23
|
+
: ["serve", ...(this.plugin ? ["--plugin", this.plugin] : [])];
|
|
24
|
+
|
|
25
|
+
this.proc = spawn(cmd, args, {
|
|
26
|
+
stdio: ["pipe", "pipe", "inherit"],
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
this.rl = readline.createInterface({
|
|
30
|
+
input: this.proc.stdout,
|
|
31
|
+
terminal: false,
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
this.rl.on("line", (line) => {
|
|
35
|
+
try {
|
|
36
|
+
const resp = JSON.parse(line);
|
|
37
|
+
if (resp.id && this.pending.has(resp.id)) {
|
|
38
|
+
const { resolve, reject } = this.pending.get(resp.id);
|
|
39
|
+
this.pending.delete(resp.id);
|
|
40
|
+
if (resp.error) {
|
|
41
|
+
reject(new Error(`MCP Error ${resp.error.code}: ${resp.error.message}`));
|
|
42
|
+
} else {
|
|
43
|
+
resolve(resp.result);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.error("InterMCP Client JSON parse error:", err);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Handshake
|
|
52
|
+
await this.request("initialize", {
|
|
53
|
+
protocolVersion: "2024-11-05",
|
|
54
|
+
clientInfo: { name: "intermcp-node-client", version: "0.2.0" },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
request(method, params = {}) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const id = ++this.requestId;
|
|
61
|
+
// AUDIT-16: Add 30-second timeout to prevent memory leak and application hang
|
|
62
|
+
const timer = setTimeout(() => {
|
|
63
|
+
this.pending.delete(id);
|
|
64
|
+
reject(new Error(`InterMCP request timeout after 30s: ${method}`));
|
|
65
|
+
}, 30000);
|
|
66
|
+
this.pending.set(id, {
|
|
67
|
+
resolve: (val) => { clearTimeout(timer); resolve(val); },
|
|
68
|
+
reject: (err) => { clearTimeout(timer); reject(err); },
|
|
69
|
+
});
|
|
70
|
+
const msg = JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n";
|
|
71
|
+
this.proc.stdin.write(msg, (err) => {
|
|
72
|
+
if (err) {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
this.pending.delete(id);
|
|
75
|
+
reject(new Error(`Failed to write to InterMCP stdin: ${err.message}`));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async listTools() {
|
|
82
|
+
const res = await this.request("tools/list");
|
|
83
|
+
return res.tools || [];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async callTool(name, args = {}) {
|
|
87
|
+
return this.request("tools/call", { name, arguments: args });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async listResources() {
|
|
91
|
+
const res = await this.request("resources/list");
|
|
92
|
+
return res.resources || [];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async readResource(uri) {
|
|
96
|
+
return this.request("resources/read", { uri });
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async listPrompts() {
|
|
100
|
+
const res = await this.request("prompts/list");
|
|
101
|
+
return res.prompts || [];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async getPrompt(name, args = {}) {
|
|
105
|
+
return this.request("prompts/get", { name, arguments: args });
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
stop() {
|
|
109
|
+
if (this.proc) {
|
|
110
|
+
this.proc.kill();
|
|
111
|
+
this.proc = null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
module.exports = { InterMcpClient };
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "intermcp",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Ultra-fast, safe Model Context Protocol (MCP) engine and multiplexing hub in pure Rust, built for Interlayer Blockchain and open for all",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"intermcp": "bin/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"index.js",
|
|
13
|
+
"index.d.ts",
|
|
14
|
+
"README.md",
|
|
15
|
+
"LICENSE"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build:rust": "cargo build --release",
|
|
19
|
+
"test": "cargo test",
|
|
20
|
+
"bench": "cargo run --release -- bench"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"mcp",
|
|
24
|
+
"model-context-protocol",
|
|
25
|
+
"ai",
|
|
26
|
+
"claude",
|
|
27
|
+
"cursor",
|
|
28
|
+
"llm",
|
|
29
|
+
"rust",
|
|
30
|
+
"agent",
|
|
31
|
+
"developer-tools"
|
|
32
|
+
],
|
|
33
|
+
"author": "Bharath B R <bharathcoorg7@gmail.com>",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.0.0"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/Bharathcoorg/intermcp.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/Bharathcoorg/intermcp/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/Bharathcoorg/intermcp#readme"
|
|
46
|
+
}
|