@vymalo/opencode-devtools-mcp 0.9.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 +45 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +2 -0
- package/dist/mcp.js +25 -0
- package/dist/mcp.js.map +1 -0
- package/dist/render.d.ts +18 -0
- package/dist/render.js +14 -0
- package/dist/render.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.js +50 -0
- package/dist/server.js.map +1 -0
- package/package.json +65 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 vymalo 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,45 @@
|
|
|
1
|
+
# @vymalo/opencode-devtools-mcp
|
|
2
|
+
|
|
3
|
+
> The [`@vymalo/opencode-devtools`](../opencode-devtools) utilities for **any MCP client** — Claude
|
|
4
|
+
> Code, Cursor, Cline, Zed, …
|
|
5
|
+
|
|
6
|
+
[](https://www.npmjs.com/package/@vymalo/opencode-devtools-mcp)
|
|
7
|
+

|
|
8
|
+

|
|
9
|
+
|
|
10
|
+
An MCP **stdio server** exposing the same local developer utilities (math, codec, crypto, datetime,
|
|
11
|
+
convert, http) over the Model Context Protocol. No bridge, no auth — each tool is pure in-process
|
|
12
|
+
compute. The MCP server and the OpenCode plugin share **one tool catalog**, so the two surfaces
|
|
13
|
+
never drift.
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
```jsonc
|
|
18
|
+
{
|
|
19
|
+
"mcpServers": {
|
|
20
|
+
"devtools": {
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": ["-y", "@vymalo/opencode-devtools-mcp"],
|
|
23
|
+
"env": {
|
|
24
|
+
"OCD_GROUPS": "math,codec,crypto,datetime,convert",
|
|
25
|
+
"OCD_HTTP_ALLOW_PRIVATE": "0",
|
|
26
|
+
"OCD_HTTP_TIMEOUT": "30000"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Env | Default | Meaning |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| `OCD_GROUPS` | the 5 offline groups | Comma list of groups to expose (add `http` to enable egress). |
|
|
36
|
+
| `OCD_HTTP_ALLOW_PRIVATE` | `0` | `1` to let the `http` group reach loopback/private hosts (SSRF guard off). |
|
|
37
|
+
| `OCD_HTTP_TIMEOUT` | `30000` | Per-request timeout (ms). |
|
|
38
|
+
|
|
39
|
+
Logs go to **stderr** (stdout carries the MCP JSON-RPC stream).
|
|
40
|
+
|
|
41
|
+
Full tool reference and security model: [`docs/devtools.md`](../../docs/devtools.md).
|
|
42
|
+
|
|
43
|
+
## License
|
|
44
|
+
|
|
45
|
+
MIT
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAsB,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/mcp.d.ts
ADDED
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { DEFAULT_GROUPS, resolveOptions, TOOL_GROUPS } from "@vymalo/opencode-devtools/lib";
|
|
4
|
+
import { createMcpServer, groupsFromEnv } from "./server.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const groups = groupsFromEnv(process.env.OCD_GROUPS, TOOL_GROUPS, DEFAULT_GROUPS);
|
|
7
|
+
const options = resolveOptions({
|
|
8
|
+
groups,
|
|
9
|
+
http: {
|
|
10
|
+
allowPrivateNetwork: /^(1|true|yes|on)$/i.test(process.env.OCD_HTTP_ALLOW_PRIVATE ?? ""),
|
|
11
|
+
timeoutMs: Number(process.env.OCD_HTTP_TIMEOUT ?? 30_000)
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
process.stderr.write(`opencode-devtools-mcp: groups ${options.groups.join(", ")}\n`);
|
|
15
|
+
if (options.groups.includes("http")) {
|
|
16
|
+
process.stderr.write(`opencode-devtools-mcp: http egress enabled (allowPrivateNetwork=${options.http.allowPrivateNetwork})\n`);
|
|
17
|
+
}
|
|
18
|
+
const server = createMcpServer(options);
|
|
19
|
+
await server.connect(new StdioServerTransport());
|
|
20
|
+
}
|
|
21
|
+
main().catch((err) => {
|
|
22
|
+
process.stderr.write(`opencode-devtools-mcp fatal: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7D,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,cAAc,CAAC;QAC7B,MAAM;QACN,IAAI,EAAE;YACJ,mBAAmB,EAAE,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;YACxF,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC;SAC1D;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mEAAmE,OAAO,CAAC,IAAI,CAAC,mBAAmB,KAAK,CACzG,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACrF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { NeutralResult } from "@vymalo/opencode-devtools/lib";
|
|
2
|
+
/** An MCP tool-result content block. Devtools results are text-only. */
|
|
3
|
+
export type McpContent = {
|
|
4
|
+
type: "text";
|
|
5
|
+
text: string;
|
|
6
|
+
};
|
|
7
|
+
export interface McpToolResult {
|
|
8
|
+
content: McpContent[];
|
|
9
|
+
isError?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Render an adapter-neutral result into MCP tool-result content. Devtools tools
|
|
13
|
+
* never return images, so both `text` and `json` results map to a TextContent
|
|
14
|
+
* (the neutral result's `text` is always self-sufficient).
|
|
15
|
+
*/
|
|
16
|
+
export declare function toMcpContent(result: NeutralResult): McpToolResult;
|
|
17
|
+
/** Render a thrown error as an MCP tool error result (so the model sees it). */
|
|
18
|
+
export declare function toMcpError(err: unknown): McpToolResult;
|
package/dist/render.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render an adapter-neutral result into MCP tool-result content. Devtools tools
|
|
3
|
+
* never return images, so both `text` and `json` results map to a TextContent
|
|
4
|
+
* (the neutral result's `text` is always self-sufficient).
|
|
5
|
+
*/
|
|
6
|
+
export function toMcpContent(result) {
|
|
7
|
+
return { content: [{ type: "text", text: result.text }] };
|
|
8
|
+
}
|
|
9
|
+
/** Render a thrown error as an MCP tool error result (so the model sees it). */
|
|
10
|
+
export function toMcpError(err) {
|
|
11
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
12
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { selectTools, type ToolContext, type ToolGroup, type ResolvedDevtoolsOptions } from "@vymalo/opencode-devtools/lib";
|
|
3
|
+
export { selectTools };
|
|
4
|
+
export interface McpServerDeps {
|
|
5
|
+
/** Inject the execution context (clock / randomness / fetch) for tests. */
|
|
6
|
+
context?: Partial<Omit<ToolContext, "options">>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Build an MCP server that exposes the group-filtered devtools catalog and runs
|
|
10
|
+
* each tool's handler locally (no bridge — these are pure compute tools).
|
|
11
|
+
*/
|
|
12
|
+
export declare function createMcpServer(options: ResolvedDevtoolsOptions, deps?: McpServerDeps): Server;
|
|
13
|
+
/** Selected group ids from a comma-separated env string, falling back to defaults. */
|
|
14
|
+
export declare function groupsFromEnv(raw: string | undefined, all: readonly ToolGroup[], fallback: readonly ToolGroup[]): ToolGroup[];
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { buildContext, selectTools, toJsonSchema } from "@vymalo/opencode-devtools/lib";
|
|
4
|
+
import { toMcpContent, toMcpError } from "./render.js";
|
|
5
|
+
export { selectTools };
|
|
6
|
+
/**
|
|
7
|
+
* Build an MCP server that exposes the group-filtered devtools catalog and runs
|
|
8
|
+
* each tool's handler locally (no bridge — these are pure compute tools).
|
|
9
|
+
*/
|
|
10
|
+
export function createMcpServer(options, deps = {}) {
|
|
11
|
+
const specs = selectTools(options.groups);
|
|
12
|
+
const byName = new Map(specs.map((spec) => [spec.name, spec]));
|
|
13
|
+
const ctx = buildContext(options, deps.context);
|
|
14
|
+
const server = new Server({ name: "opencode-devtools", version: "0.9.0" }, { capabilities: { tools: {} } });
|
|
15
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
16
|
+
tools: specs.map((spec) => ({
|
|
17
|
+
name: spec.name,
|
|
18
|
+
description: spec.description,
|
|
19
|
+
inputSchema: toJsonSchema(spec.input)
|
|
20
|
+
}))
|
|
21
|
+
}));
|
|
22
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
23
|
+
const render = (r) => r;
|
|
24
|
+
const spec = byName.get(request.params.name);
|
|
25
|
+
if (!spec) {
|
|
26
|
+
return render(toMcpError(new Error(`unknown tool: ${request.params.name}`)));
|
|
27
|
+
}
|
|
28
|
+
const args = (request.params.arguments ?? {});
|
|
29
|
+
try {
|
|
30
|
+
const result = await spec.handler(args, ctx);
|
|
31
|
+
return render(toMcpContent(result));
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return render(toMcpError(err));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return server;
|
|
38
|
+
}
|
|
39
|
+
/** Selected group ids from a comma-separated env string, falling back to defaults. */
|
|
40
|
+
export function groupsFromEnv(raw, all, fallback) {
|
|
41
|
+
if (!raw) {
|
|
42
|
+
return [...fallback];
|
|
43
|
+
}
|
|
44
|
+
const parts = raw
|
|
45
|
+
.split(",")
|
|
46
|
+
.map((s) => s.trim())
|
|
47
|
+
.filter((g) => all.includes(g));
|
|
48
|
+
return parts.length > 0 ? parts : [...fallback];
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vymalo/opencode-devtools-mcp",
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "MCP server for @vymalo/opencode-devtools — exposes the same local developer utilities (math, codec, crypto, datetime, convert, http) over the Model Context Protocol so any MCP client (Claude Code, Cursor, Cline, …) can call them. No bridge, no auth — pure deterministic compute.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "vymalo contributors",
|
|
7
|
+
"homepage": "https://github.com/vymalo/opencode-oauth2#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/vymalo/opencode-oauth2.git",
|
|
11
|
+
"directory": "packages/opencode-devtools-mcp"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/vymalo/opencode-oauth2/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"model-context-protocol",
|
|
19
|
+
"utilities",
|
|
20
|
+
"math",
|
|
21
|
+
"crypto",
|
|
22
|
+
"jwt",
|
|
23
|
+
"datetime",
|
|
24
|
+
"cron"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "dist/index.js",
|
|
28
|
+
"types": "dist/index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"bin": {
|
|
36
|
+
"opencode-devtools-mcp": "dist/mcp.js"
|
|
37
|
+
},
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"files": [
|
|
40
|
+
"dist"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
50
|
+
"@vymalo/opencode-devtools": "0.9.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"vite": "^8.0.14",
|
|
54
|
+
"vitest": "^4.1.7"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsc -p tsconfig.json",
|
|
58
|
+
"lint": "biome lint .",
|
|
59
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"coverage": "vitest run --coverage",
|
|
62
|
+
"format": "biome format --write .",
|
|
63
|
+
"format:check": "biome format ."
|
|
64
|
+
}
|
|
65
|
+
}
|