@1claw/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.
Files changed (50) hide show
  1. package/README.md +144 -0
  2. package/dist/client.d.ts +41 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +92 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +168 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tools/create_vault.d.ts +21 -0
  11. package/dist/tools/create_vault.d.ts.map +1 -0
  12. package/dist/tools/create_vault.js +28 -0
  13. package/dist/tools/create_vault.js.map +1 -0
  14. package/dist/tools/delete_secret.d.ts +21 -0
  15. package/dist/tools/delete_secret.d.ts.map +1 -0
  16. package/dist/tools/delete_secret.js +29 -0
  17. package/dist/tools/delete_secret.js.map +1 -0
  18. package/dist/tools/describe_secret.d.ts +17 -0
  19. package/dist/tools/describe_secret.d.ts.map +1 -0
  20. package/dist/tools/describe_secret.js +52 -0
  21. package/dist/tools/describe_secret.js.map +1 -0
  22. package/dist/tools/get_secret.d.ts +21 -0
  23. package/dist/tools/get_secret.d.ts.map +1 -0
  24. package/dist/tools/get_secret.js +39 -0
  25. package/dist/tools/get_secret.js.map +1 -0
  26. package/dist/tools/grant_access.d.ts +33 -0
  27. package/dist/tools/grant_access.d.ts.map +1 -0
  28. package/dist/tools/grant_access.js +36 -0
  29. package/dist/tools/grant_access.js.map +1 -0
  30. package/dist/tools/list_secrets.d.ts +17 -0
  31. package/dist/tools/list_secrets.d.ts.map +1 -0
  32. package/dist/tools/list_secrets.js +26 -0
  33. package/dist/tools/list_secrets.js.map +1 -0
  34. package/dist/tools/list_vaults.d.ts +9 -0
  35. package/dist/tools/list_vaults.d.ts.map +1 -0
  36. package/dist/tools/list_vaults.js +18 -0
  37. package/dist/tools/list_vaults.js.map +1 -0
  38. package/dist/tools/put_secret.d.ts +41 -0
  39. package/dist/tools/put_secret.d.ts.map +1 -0
  40. package/dist/tools/put_secret.js +48 -0
  41. package/dist/tools/put_secret.js.map +1 -0
  42. package/dist/tools/share_secret.d.ts +33 -0
  43. package/dist/tools/share_secret.d.ts.map +1 -0
  44. package/dist/tools/share_secret.js +53 -0
  45. package/dist/tools/share_secret.js.map +1 -0
  46. package/dist/types.d.ts +56 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +11 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # @1claw/mcp
2
+
3
+ An MCP (Model Context Protocol) server that gives AI agents secure, just-in-time access to secrets stored in the [1claw](https://1claw.xyz) vault. Secrets are fetched at runtime via the 1claw Agent API and never persisted in the LLM context window beyond the moment they are used.
4
+
5
+ ## Transport Modes
6
+
7
+ The server supports two transport modes:
8
+
9
+ | Mode | Use case | Auth |
10
+ |---|---|---|
11
+ | **stdio** (default) | Local — Claude Desktop, Cursor | Env vars: `ONECLAW_AGENT_TOKEN`, `ONECLAW_VAULT_ID` |
12
+ | **httpStream** | Hosted at `mcp.1claw.xyz` | Per-request headers: `Authorization`, `X-Vault-ID` |
13
+
14
+ Set `MCP_TRANSPORT=httpStream` and `PORT=8080` to run in hosted mode.
15
+
16
+ ## Installation (local / stdio)
17
+
18
+ ```bash
19
+ cd packages/mcp
20
+ pnpm install
21
+ pnpm run build
22
+ ```
23
+
24
+ ## Environment Variables
25
+
26
+ | Variable | Required | Default | Description |
27
+ |---|---|---|---|
28
+ | `ONECLAW_AGENT_TOKEN` | stdio only | — | Bearer token for the 1claw Agent API |
29
+ | `ONECLAW_VAULT_ID` | stdio only | — | UUID of the vault to operate on |
30
+ | `ONECLAW_BASE_URL` | No | `https://api.1claw.xyz` | API base URL (override for self-hosted) |
31
+ | `MCP_TRANSPORT` | No | `stdio` | Transport mode: `stdio` or `httpStream` |
32
+ | `PORT` | No | `8080` | HTTP port (httpStream mode only) |
33
+
34
+ ## Tools
35
+
36
+ | Tool | Description |
37
+ |---|---|
38
+ | `list_secrets` | List all secrets (metadata only — never values) |
39
+ | `get_secret` | Fetch the decrypted value of a secret by path |
40
+ | `put_secret` | Create or update a secret (creates a new version) |
41
+ | `delete_secret` | Soft-delete a secret at a path |
42
+ | `describe_secret` | Get metadata without fetching the value |
43
+ | `rotate_and_store` | Store a new value for an existing secret and return the version |
44
+ | `get_env_bundle` | Fetch an env_bundle secret and parse it as KEY=VALUE JSON |
45
+ | `create_vault` | Create a new vault (auto-shared with the agent's human creator) |
46
+ | `list_vaults` | List all vaults the agent can access (own + shared) |
47
+ | `grant_access` | Share a vault with a user or agent (own vaults only) |
48
+
49
+ ## Resources
50
+
51
+ | URI | Description |
52
+ |---|---|
53
+ | `vault://secrets` | Browsable listing of all secret paths (metadata only) |
54
+
55
+ ## Configuration
56
+
57
+ ### Hosted (mcp.1claw.xyz)
58
+
59
+ For MCP clients that support remote servers with HTTP streaming:
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "1claw": {
65
+ "url": "https://mcp.1claw.xyz/mcp",
66
+ "headers": {
67
+ "Authorization": "Bearer <your-agent-token>",
68
+ "X-Vault-ID": "<your-vault-id>"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ ### Claude Desktop (local stdio)
76
+
77
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
78
+
79
+ ```json
80
+ {
81
+ "mcpServers": {
82
+ "1claw": {
83
+ "command": "node",
84
+ "args": ["/absolute/path/to/packages/mcp/dist/index.js"],
85
+ "env": {
86
+ "ONECLAW_AGENT_TOKEN": "your-agent-token-here",
87
+ "ONECLAW_VAULT_ID": "your-vault-id-here"
88
+ }
89
+ }
90
+ }
91
+ }
92
+ ```
93
+
94
+ ### Cursor (local stdio)
95
+
96
+ Add to `.cursor/mcp.json` in your project root:
97
+
98
+ ```json
99
+ {
100
+ "mcpServers": {
101
+ "1claw": {
102
+ "command": "node",
103
+ "args": ["./packages/mcp/dist/index.js"],
104
+ "env": {
105
+ "ONECLAW_AGENT_TOKEN": "${env:ONECLAW_AGENT_TOKEN}",
106
+ "ONECLAW_VAULT_ID": "${env:ONECLAW_VAULT_ID}"
107
+ }
108
+ }
109
+ }
110
+ }
111
+ ```
112
+
113
+ ## Example Workflow
114
+
115
+ 1. **Discover** — call `list_secrets` to see what credentials are available.
116
+ 2. **Check** — call `describe_secret` with path `api-keys/stripe` to verify it exists and hasn't expired.
117
+ 3. **Fetch** — call `get_secret` with path `api-keys/stripe` to get the decrypted value.
118
+ 4. **Use** — pass the value into your API call.
119
+ 5. **Forget** — do not store the value in summaries, logs, or memory.
120
+
121
+ ## Deployment
122
+
123
+ The MCP server auto-deploys to Cloud Run on push to `main` (when `packages/mcp/**` changes). See `.github/workflows/deploy-mcp.yml`.
124
+
125
+ Infrastructure is managed via Terraform in `infra/`. Set `mcp_domain = "mcp.1claw.xyz"` in your `terraform.tfvars` to configure the custom domain.
126
+
127
+ ## Development
128
+
129
+ ```bash
130
+ # Interactive testing via CLI
131
+ pnpm dev
132
+
133
+ # MCP Inspector (browser UI)
134
+ pnpm inspect
135
+ ```
136
+
137
+ ## Security
138
+
139
+ - **Values are never logged.** `get_secret` logs only `"secret accessed: <path>"`.
140
+ - **Secrets are fetched just-in-time.** They exist in the agent's context only for the duration of a single tool call.
141
+ - **Per-session auth in hosted mode.** Each HTTP streaming connection authenticates independently via headers. No shared state between sessions.
142
+ - **Token scoping.** Use the 1claw dashboard to create agent tokens with the minimum permissions needed. Restrict by vault, path prefix, or action.
143
+ - **No hardcoded credentials.** All auth is via environment variables (stdio) or headers (httpStream).
144
+ - **410/404 handling.** Expired or missing secrets surface clear error messages rather than raw HTTP codes.
@@ -0,0 +1,41 @@
1
+ import type { SecretMetadata, SecretWithValue, SecretListResponse, VaultResponse, VaultListResponse, PolicyResponse, ShareLinkResponse } from "./types.js";
2
+ export declare class OneClawApiError extends Error {
3
+ status: number;
4
+ detail: string;
5
+ constructor(status: number, detail: string);
6
+ }
7
+ export interface ClientConfig {
8
+ baseUrl: string;
9
+ token: string;
10
+ vaultId: string;
11
+ }
12
+ export declare class OneClawClient {
13
+ private baseUrl;
14
+ private token;
15
+ private vaultId;
16
+ constructor(config: ClientConfig);
17
+ private headers;
18
+ private vaultUrl;
19
+ private request;
20
+ listSecrets(): Promise<SecretListResponse>;
21
+ getSecret(path: string): Promise<SecretWithValue>;
22
+ putSecret(path: string, body: {
23
+ value: string;
24
+ type: string;
25
+ metadata?: Record<string, unknown>;
26
+ expires_at?: string;
27
+ max_access_count?: number;
28
+ }): Promise<SecretMetadata>;
29
+ deleteSecret(path: string): Promise<void>;
30
+ createVault(name: string, description?: string): Promise<VaultResponse>;
31
+ listVaults(): Promise<VaultListResponse>;
32
+ shareSecret(secretId: string, options: {
33
+ recipient_type: string;
34
+ email?: string;
35
+ recipient_id?: string;
36
+ expires_at: string;
37
+ max_access_count?: number;
38
+ }): Promise<ShareLinkResponse>;
39
+ createPolicy(vaultId: string, principalType: string, principalId: string, permissions: string[], secretPathPattern?: string): Promise<PolicyResponse>;
40
+ }
41
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,qBAAa,eAAgB,SAAQ,KAAK;IAE/B,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;gBADd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;CAKxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AASD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,YAAY;IAMhC,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,QAAQ;YAIF,OAAO;IA2Bf,WAAW,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAI1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAMjD,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GACA,OAAO,CAAC,cAAc,CAAC;IAOpB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAOvE,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAIxC,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;QACP,cAAc,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GACA,OAAO,CAAC,iBAAiB,CAAC;IAOvB,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,EACrB,iBAAiB,SAAO,GACvB,OAAO,CAAC,cAAc,CAAC;CAc3B"}
package/dist/client.js ADDED
@@ -0,0 +1,92 @@
1
+ export class OneClawApiError extends Error {
2
+ status;
3
+ detail;
4
+ constructor(status, detail) {
5
+ super(detail);
6
+ this.status = status;
7
+ this.detail = detail;
8
+ this.name = "OneClawApiError";
9
+ }
10
+ }
11
+ function encodePath(path) {
12
+ return path
13
+ .split("/")
14
+ .map((s) => encodeURIComponent(s))
15
+ .join("/");
16
+ }
17
+ export class OneClawClient {
18
+ baseUrl;
19
+ token;
20
+ vaultId;
21
+ constructor(config) {
22
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
23
+ this.token = config.token;
24
+ this.vaultId = config.vaultId;
25
+ }
26
+ headers() {
27
+ return {
28
+ Authorization: `Bearer ${this.token}`,
29
+ "Content-Type": "application/json",
30
+ };
31
+ }
32
+ vaultUrl(suffix = "") {
33
+ return `${this.baseUrl}/v1/vaults/${this.vaultId}${suffix}`;
34
+ }
35
+ async request(url, init) {
36
+ const res = await fetch(url, {
37
+ ...init,
38
+ headers: { ...this.headers(), ...init?.headers },
39
+ });
40
+ if (!res.ok) {
41
+ if (res.status === 402) {
42
+ throw new OneClawApiError(402, "Free tier quota exhausted. Upgrade your plan or add payment at https://1claw.xyz/settings/billing");
43
+ }
44
+ let detail = `HTTP ${res.status}`;
45
+ try {
46
+ const body = (await res.json());
47
+ if (body.detail)
48
+ detail = body.detail;
49
+ }
50
+ catch {
51
+ // use default detail
52
+ }
53
+ throw new OneClawApiError(res.status, detail);
54
+ }
55
+ if (res.status === 204)
56
+ return undefined;
57
+ return res.json();
58
+ }
59
+ async listSecrets() {
60
+ return this.request(this.vaultUrl("/secrets"));
61
+ }
62
+ async getSecret(path) {
63
+ return this.request(this.vaultUrl(`/secrets/${encodePath(path)}`));
64
+ }
65
+ async putSecret(path, body) {
66
+ return this.request(this.vaultUrl(`/secrets/${encodePath(path)}`), { method: "PUT", body: JSON.stringify(body) });
67
+ }
68
+ async deleteSecret(path) {
69
+ await this.request(this.vaultUrl(`/secrets/${encodePath(path)}`), { method: "DELETE" });
70
+ }
71
+ async createVault(name, description) {
72
+ return this.request(`${this.baseUrl}/v1/vaults`, { method: "POST", body: JSON.stringify({ name, description: description ?? "" }) });
73
+ }
74
+ async listVaults() {
75
+ return this.request(`${this.baseUrl}/v1/vaults`);
76
+ }
77
+ async shareSecret(secretId, options) {
78
+ return this.request(`${this.baseUrl}/v1/secrets/${secretId}/share`, { method: "POST", body: JSON.stringify(options) });
79
+ }
80
+ async createPolicy(vaultId, principalType, principalId, permissions, secretPathPattern = "**") {
81
+ return this.request(`${this.baseUrl}/v1/vaults/${vaultId}/policies`, {
82
+ method: "POST",
83
+ body: JSON.stringify({
84
+ secret_path_pattern: secretPathPattern,
85
+ principal_type: principalType,
86
+ principal_id: principalId,
87
+ permissions,
88
+ }),
89
+ });
90
+ }
91
+ }
92
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ import { FastMCP, UserError } from "fastmcp";
3
+ import { z } from "zod";
4
+ import { OneClawClient, OneClawApiError } from "./client.js";
5
+ import { listSecretsTool } from "./tools/list_secrets.js";
6
+ import { getSecretTool } from "./tools/get_secret.js";
7
+ import { putSecretTool } from "./tools/put_secret.js";
8
+ import { deleteSecretTool } from "./tools/delete_secret.js";
9
+ import { describeSecretTool } from "./tools/describe_secret.js";
10
+ import { createVaultTool } from "./tools/create_vault.js";
11
+ import { listVaultsTool } from "./tools/list_vaults.js";
12
+ import { grantAccessTool } from "./tools/grant_access.js";
13
+ import { shareSecretTool } from "./tools/share_secret.js";
14
+ const baseUrl = process.env.ONECLAW_BASE_URL ?? "https://api.1claw.xyz";
15
+ const transport = process.env.MCP_TRANSPORT ?? "stdio";
16
+ const port = parseInt(process.env.PORT ?? "8080", 10);
17
+ // ── Shared client (stdio mode) ──────────────────────
18
+ let sharedClient;
19
+ if (transport === "stdio") {
20
+ const token = process.env.ONECLAW_AGENT_TOKEN;
21
+ const vaultId = process.env.ONECLAW_VAULT_ID;
22
+ if (!token) {
23
+ console.error("ONECLAW_AGENT_TOKEN is required. Set it as an environment variable.");
24
+ process.exit(1);
25
+ }
26
+ if (!vaultId) {
27
+ console.error("ONECLAW_VAULT_ID is required. Set it as an environment variable.");
28
+ process.exit(1);
29
+ }
30
+ sharedClient = new OneClawClient({ baseUrl, token, vaultId });
31
+ }
32
+ function resolveClient(session) {
33
+ if (session) {
34
+ return new OneClawClient({ baseUrl, token: session.token, vaultId: session.vaultId });
35
+ }
36
+ if (sharedClient)
37
+ return sharedClient;
38
+ throw new UserError("Not authenticated. Provide Authorization and X-Vault-ID headers.");
39
+ }
40
+ const serverOpts = {
41
+ name: "1claw",
42
+ version: "0.1.0",
43
+ health: { enabled: true, path: "/health" },
44
+ };
45
+ if (transport === "httpStream") {
46
+ serverOpts.authenticate = (request) => {
47
+ const auth = (request.headers["authorization"] ?? "");
48
+ const token = auth.replace(/^Bearer\s+/i, "").trim();
49
+ const vaultId = (request.headers["x-vault-id"] ?? "");
50
+ if (!token)
51
+ return Promise.reject(new Error("Missing Authorization header (Bearer <agent-token>)"));
52
+ if (!vaultId)
53
+ return Promise.reject(new Error("Missing X-Vault-ID header"));
54
+ return Promise.resolve({ token, vaultId });
55
+ };
56
+ }
57
+ const server = new FastMCP(serverOpts);
58
+ function registerTool(factory) {
59
+ const proto = factory(sharedClient ?? new OneClawClient({ baseUrl, token: "", vaultId: "" }));
60
+ server.addTool({
61
+ name: proto.name,
62
+ description: proto.description,
63
+ parameters: proto.parameters,
64
+ execute: async (args, context) => {
65
+ const client = resolveClient(context.session);
66
+ const tool = factory(client);
67
+ return tool.execute(args, context);
68
+ },
69
+ });
70
+ }
71
+ registerTool(listSecretsTool);
72
+ registerTool(getSecretTool);
73
+ registerTool(putSecretTool);
74
+ registerTool(deleteSecretTool);
75
+ registerTool(describeSecretTool);
76
+ registerTool(createVaultTool);
77
+ registerTool(listVaultsTool);
78
+ registerTool(grantAccessTool);
79
+ registerTool(shareSecretTool);
80
+ // ── Stretch: rotate_and_store ────────────────────────
81
+ server.addTool({
82
+ name: "rotate_and_store",
83
+ description: "Store a new value for an existing secret (creating a new version) and return the version number. Useful when an agent has regenerated an API key and needs to persist it.",
84
+ parameters: z.object({
85
+ path: z.string().min(1).describe("Secret path to rotate"),
86
+ value: z.string().min(1).describe("The new secret value"),
87
+ }),
88
+ execute: async (args, context) => {
89
+ const client = resolveClient(context.session);
90
+ const result = await client.putSecret(args.path, {
91
+ value: args.value,
92
+ type: "api_key",
93
+ });
94
+ context.log.info(`secret rotated: ${args.path}`);
95
+ return `Rotated secret at '${args.path}'. New version: ${result.version}.`;
96
+ },
97
+ });
98
+ // ── Stretch: get_env_bundle ──────────────────────────
99
+ server.addTool({
100
+ name: "get_env_bundle",
101
+ description: "Fetch a secret of type env_bundle, parse its KEY=VALUE lines, and return a structured JSON object. Useful for injecting environment variables into subprocesses.",
102
+ parameters: z.object({
103
+ path: z.string().min(1).describe("Path to an env_bundle secret"),
104
+ }),
105
+ execute: async (args, context) => {
106
+ const client = resolveClient(context.session);
107
+ try {
108
+ const secret = await client.getSecret(args.path);
109
+ context.log.info(`env_bundle accessed: ${args.path}`);
110
+ if (secret.type !== "env_bundle") {
111
+ throw new UserError(`Secret at '${args.path}' is type '${secret.type}', not 'env_bundle'.`);
112
+ }
113
+ const env = {};
114
+ for (const line of secret.value.split("\n")) {
115
+ const trimmed = line.trim();
116
+ if (!trimmed || trimmed.startsWith("#"))
117
+ continue;
118
+ const eqIdx = trimmed.indexOf("=");
119
+ if (eqIdx === -1)
120
+ continue;
121
+ env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);
122
+ }
123
+ return JSON.stringify(env, null, 2);
124
+ }
125
+ catch (err) {
126
+ if (err instanceof OneClawApiError) {
127
+ if (err.status === 410) {
128
+ throw new UserError(`Secret at path '${args.path}' is expired or has exceeded its maximum access count.`);
129
+ }
130
+ if (err.status === 404) {
131
+ throw new UserError(`No secret found at path '${args.path}'.`);
132
+ }
133
+ }
134
+ throw err;
135
+ }
136
+ },
137
+ });
138
+ // ── Resource: browsable secret listing ───────────────
139
+ server.addResource({
140
+ uri: "vault://secrets",
141
+ name: "Vault secrets",
142
+ description: "Browsable listing of all secret paths in the configured vault (metadata only, no values).",
143
+ mimeType: "application/json",
144
+ async load(auth) {
145
+ const client = resolveClient(auth);
146
+ const data = await client.listSecrets();
147
+ return {
148
+ text: JSON.stringify(data.secrets.map((s) => ({
149
+ path: s.path,
150
+ type: s.type,
151
+ version: s.version,
152
+ expires_at: s.expires_at,
153
+ })), null, 2),
154
+ };
155
+ },
156
+ });
157
+ // ── Start ────────────────────────────────────────────
158
+ if (transport === "httpStream") {
159
+ server.start({
160
+ transportType: "httpStream",
161
+ httpStream: { port, host: "0.0.0.0" },
162
+ });
163
+ console.log(`1claw MCP server listening on port ${port} (HTTP streaming)`);
164
+ }
165
+ else {
166
+ server.start({ transportType: "stdio" });
167
+ }
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ import type { OneClawClient } from "../client.js";
3
+ export declare function createVaultTool(client: OneClawClient): {
4
+ name: "create_vault";
5
+ description: string;
6
+ parameters: z.ZodObject<{
7
+ name: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ name: string;
11
+ description?: string | undefined;
12
+ }, {
13
+ name: string;
14
+ description?: string | undefined;
15
+ }>;
16
+ execute: (args: {
17
+ name: string;
18
+ description?: string;
19
+ }) => Promise<string>;
20
+ };
21
+ //# sourceMappingURL=create_vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_vault.d.ts","sourceRoot":"","sources":["../../src/tools/create_vault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;oBAgB3B;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;EAY/D"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ export function createVaultTool(client) {
3
+ return {
4
+ name: "create_vault",
5
+ description: "Create a new vault for organising secrets. The vault is owned by this agent and automatically shared with the human who registered you. Use descriptive names so your human collaborator can find it in the dashboard.",
6
+ parameters: z.object({
7
+ name: z
8
+ .string()
9
+ .min(1)
10
+ .max(255)
11
+ .describe("Vault name (e.g. 'stripe-production', 'ci-deploy-keys')"),
12
+ description: z
13
+ .string()
14
+ .optional()
15
+ .describe("Short description of what this vault is for"),
16
+ }),
17
+ execute: async (args) => {
18
+ const vault = await client.createVault(args.name, args.description);
19
+ return (`Vault created successfully.\n` +
20
+ ` ID: ${vault.id}\n` +
21
+ ` Name: ${vault.name}\n` +
22
+ ` Owner: ${vault.created_by_type}:${vault.created_by}\n\n` +
23
+ `The vault has been automatically shared with your creator. ` +
24
+ `You can now store secrets with put_secret (use the vault list to switch vaults).`);
25
+ },
26
+ };
27
+ }
28
+ //# sourceMappingURL=create_vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_vault.js","sourceRoot":"","sources":["../../src/tools/create_vault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,OAAO;QACL,IAAI,EAAE,cAAuB;QAC7B,WAAW,EACT,wNAAwN;QAC1N,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,CAAC,yDAAyD,CAAC;YACtE,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,6CAA6C,CAAC;SAC3D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IAA4C,EAAE,EAAE;YAC9D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACpE,OAAO,CACL,+BAA+B;gBAC/B,SAAS,KAAK,CAAC,EAAE,IAAI;gBACrB,WAAW,KAAK,CAAC,IAAI,IAAI;gBACzB,YAAY,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,UAAU,MAAM;gBAC3D,6DAA6D;gBAC7D,kFAAkF,CACnF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ import { type OneClawClient } from "../client.js";
3
+ export declare function deleteSecretTool(client: OneClawClient): {
4
+ name: "delete_secret";
5
+ description: string;
6
+ parameters: z.ZodObject<{
7
+ path: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ path: string;
10
+ }, {
11
+ path: string;
12
+ }>;
13
+ execute: (args: {
14
+ path: string;
15
+ }, { log }: {
16
+ log: {
17
+ info: (msg: string) => void;
18
+ };
19
+ }) => Promise<string>;
20
+ };
21
+ //# sourceMappingURL=delete_secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete_secret.d.ts","sourceRoot":"","sources":["../../src/tools/delete_secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEnE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;oBAW5B;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,WAAW;QAAE,GAAG,EAAE;YAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;SAAE,CAAA;KAAE;EAa5F"}
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ import { UserError } from "fastmcp";
3
+ import { OneClawApiError } from "../client.js";
4
+ export function deleteSecretTool(client) {
5
+ return {
6
+ name: "delete_secret",
7
+ description: "Soft-delete a secret at the given path. All versions are marked deleted. This is reversible by an admin.",
8
+ parameters: z.object({
9
+ path: z
10
+ .string()
11
+ .min(1)
12
+ .describe("Secret path to delete, e.g. 'api-keys/old-stripe'"),
13
+ }),
14
+ execute: async (args, { log }) => {
15
+ try {
16
+ await client.deleteSecret(args.path);
17
+ log.info(`secret deleted: ${args.path}`);
18
+ return `Secret at '${args.path}' has been soft-deleted.`;
19
+ }
20
+ catch (err) {
21
+ if (err instanceof OneClawApiError && err.status === 404) {
22
+ throw new UserError(`No secret found at path '${args.path}'.`);
23
+ }
24
+ throw err;
25
+ }
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=delete_secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete_secret.js","sourceRoot":"","sources":["../../src/tools/delete_secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,eAAe,EAAsB,MAAM,cAAc,CAAC;AAEnE,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO;QACL,IAAI,EAAE,eAAwB;QAC9B,WAAW,EACT,0GAA0G;QAC5G,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,mDAAmD,CAAC;SACjE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE,GAAG,EAA4C,EAAE,EAAE;YAC3F,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzC,OAAO,cAAc,IAAI,CAAC,IAAI,0BAA0B,CAAC;YAC3D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,eAAe,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACzD,MAAM,IAAI,SAAS,CAAC,4BAA4B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;gBACjE,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ import { type OneClawClient } from "../client.js";
3
+ export declare function describeSecretTool(client: OneClawClient): {
4
+ name: "describe_secret";
5
+ description: string;
6
+ parameters: z.ZodObject<{
7
+ path: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ path: string;
10
+ }, {
11
+ path: string;
12
+ }>;
13
+ execute: (args: {
14
+ path: string;
15
+ }) => Promise<string>;
16
+ };
17
+ //# sourceMappingURL=describe_secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe_secret.d.ts","sourceRoot":"","sources":["../../src/tools/describe_secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEnE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;oBAW9B;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;EAgDzC"}