@geostack/arc-mcp-adapter 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.
- package/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +127 -0
- package/dist/index.js +626 -0
- package/dist/index.js.map +1 -0
- package/package.json +29 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 GEOstack
|
|
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,66 @@
|
|
|
1
|
+
# @geostack/arc-mcp-adapter
|
|
2
|
+
|
|
3
|
+
MCP transport adapter for [Arc](https://www.npmjs.com/package/@geostack/arc). It exposes your Arc-protected actions as MCP tools and routes every tool call back through Arc policy, approvals, signed execution, and audit.
|
|
4
|
+
|
|
5
|
+
MCP answers "what tools can the agent call?" Arc answers "should this specific action run right now?" This adapter is the bridge. It never executes app business logic, never approves actions, and never bypasses policy.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @geostack/arc-mcp-adapter
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## What it does
|
|
14
|
+
|
|
15
|
+
- Authenticates to Arc with `ARC_AGENT_TOKEN`
|
|
16
|
+
- Fetches Arc action definitions for your app (`ARC_APP_SLUG` or `ARC_APP_ID`)
|
|
17
|
+
- Maps each Arc action to an MCP tool (same name, Arc input schema, risk level + default decision in the description)
|
|
18
|
+
- Creates an Arc invocation for every MCP tool call and returns allowed / pending-approval / blocked
|
|
19
|
+
- Fails closed when config is missing or Arc is unavailable; redacts token-like strings from returned errors
|
|
20
|
+
|
|
21
|
+
## Configure
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
export ARC_API_URL=https://your-arc-api
|
|
25
|
+
export ARC_AGENT_TOKEN=<agent-token> # from a secret store; never commit
|
|
26
|
+
export ARC_APP_SLUG=<app-slug> # or ARC_APP_ID
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Run (stdio MCP server)
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
arc-mcp-adapter config # print sanitized config
|
|
33
|
+
arc-mcp-adapter start # start the MCP stdio server
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Example MCP client entry:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"mcpServers": {
|
|
41
|
+
"arc": {
|
|
42
|
+
"command": "arc-mcp-adapter",
|
|
43
|
+
"args": ["start"],
|
|
44
|
+
"env": {
|
|
45
|
+
"ARC_API_URL": "https://your-arc-api",
|
|
46
|
+
"ARC_AGENT_TOKEN": "<agent-token>",
|
|
47
|
+
"ARC_APP_SLUG": "<app-slug>"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Decision behavior
|
|
55
|
+
|
|
56
|
+
- **allow** — Arc returns the invocation (typically queued for signed execution). The adapter never fakes execution.
|
|
57
|
+
- **ask** — returns "requires approval in Arc." A human approves through the Arc approval flow; the adapter never auto-approves and never converts ask to allow.
|
|
58
|
+
- **block** — terminal. The adapter returns blocked and never calls app handlers.
|
|
59
|
+
|
|
60
|
+
Idempotency is preserved: pass `_meta.arc_idempotency_key` (or `_meta["arc/idempotency-key"]`), otherwise the adapter generates one. Arc audit remains the system of record.
|
|
61
|
+
|
|
62
|
+
See the [Arc package](https://www.npmjs.com/package/@geostack/arc) for the full action-authority model.
|
|
63
|
+
|
|
64
|
+
## License
|
|
65
|
+
|
|
66
|
+
MIT
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { main } from "./index.js";
|
|
4
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
5
|
+
const code = await main();
|
|
6
|
+
process.exitCode = code;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;IAC1B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export type ArcMcpDefaultDecision = "allow" | "ask" | "block";
|
|
2
|
+
export type ArcMcpRiskLevel = "high" | "low" | "medium";
|
|
3
|
+
export type JsonObject = Record<string, unknown>;
|
|
4
|
+
export type FetchLike = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
5
|
+
export type ArcActionDefinition = {
|
|
6
|
+
defaultDecision: ArcMcpDefaultDecision;
|
|
7
|
+
description?: string;
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
input: JsonObject;
|
|
10
|
+
name: string;
|
|
11
|
+
risk: ArcMcpRiskLevel;
|
|
12
|
+
};
|
|
13
|
+
export type ArcActionDefinitions = Record<string, ArcActionDefinition>;
|
|
14
|
+
export type ArcActionSyncItem = {
|
|
15
|
+
default_decision: ArcMcpDefaultDecision;
|
|
16
|
+
description: string | null;
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
input_schema: JsonObject;
|
|
19
|
+
key: string;
|
|
20
|
+
name: string;
|
|
21
|
+
risk_level: ArcMcpRiskLevel;
|
|
22
|
+
};
|
|
23
|
+
export type ArcMcpActionDefinition = ArcActionSyncItem & {
|
|
24
|
+
app_id?: string;
|
|
25
|
+
created_at?: string;
|
|
26
|
+
id?: string;
|
|
27
|
+
updated_at?: string;
|
|
28
|
+
};
|
|
29
|
+
export type ArcMcpActionSource = ArcMcpActionDefinition[] | ArcActionDefinitions | Record<string, ArcMcpActionDefinition>;
|
|
30
|
+
export type ArcMcpAdapterOptions = {
|
|
31
|
+
actions?: ArcMcpActionSource;
|
|
32
|
+
agentToken?: string;
|
|
33
|
+
appId?: string;
|
|
34
|
+
appSlug?: string;
|
|
35
|
+
arcApiUrl?: string;
|
|
36
|
+
fetch?: FetchLike;
|
|
37
|
+
idempotencyKeyFactory?: () => string;
|
|
38
|
+
serverName?: string;
|
|
39
|
+
};
|
|
40
|
+
export type ArcMcpToolDefinition = {
|
|
41
|
+
description: string;
|
|
42
|
+
inputSchema: JsonObject;
|
|
43
|
+
name: string;
|
|
44
|
+
title: string;
|
|
45
|
+
};
|
|
46
|
+
export type ArcMcpInvocationResult = {
|
|
47
|
+
approval_id: string | null;
|
|
48
|
+
decision: string | null;
|
|
49
|
+
idempotency_key: string;
|
|
50
|
+
invocation_id: string | null;
|
|
51
|
+
message: string;
|
|
52
|
+
result: unknown;
|
|
53
|
+
status: "blocked" | "error" | "executed" | "pending_approval" | "queued";
|
|
54
|
+
};
|
|
55
|
+
export type ArcMcpToolCallOptions = {
|
|
56
|
+
idempotencyKey?: string;
|
|
57
|
+
};
|
|
58
|
+
export type McpContentBlock = {
|
|
59
|
+
text: string;
|
|
60
|
+
type: "text";
|
|
61
|
+
};
|
|
62
|
+
export type McpCallToolResult = {
|
|
63
|
+
content: McpContentBlock[];
|
|
64
|
+
isError?: boolean;
|
|
65
|
+
structuredContent?: unknown;
|
|
66
|
+
};
|
|
67
|
+
type JsonRpcResponse = {
|
|
68
|
+
id: number | string | null;
|
|
69
|
+
jsonrpc: "2.0";
|
|
70
|
+
result: unknown;
|
|
71
|
+
} | {
|
|
72
|
+
error: {
|
|
73
|
+
code: number;
|
|
74
|
+
message: string;
|
|
75
|
+
};
|
|
76
|
+
id: number | string | null;
|
|
77
|
+
jsonrpc: "2.0";
|
|
78
|
+
};
|
|
79
|
+
export declare class ArcMcpError extends Error {
|
|
80
|
+
readonly code: string;
|
|
81
|
+
constructor(code: string, message: string);
|
|
82
|
+
}
|
|
83
|
+
export declare class ArcMcpConfigurationError extends ArcMcpError {
|
|
84
|
+
constructor(message: string);
|
|
85
|
+
}
|
|
86
|
+
export declare class ArcMcpAdapter {
|
|
87
|
+
readonly options: ArcMcpAdapterOptions;
|
|
88
|
+
private readonly client;
|
|
89
|
+
private readonly configuredActions;
|
|
90
|
+
private readonly idempotencyKeyFactory;
|
|
91
|
+
constructor(options?: ArcMcpAdapterOptions);
|
|
92
|
+
static fromEnv(env?: NodeJS.ProcessEnv, overrides?: Omit<ArcMcpAdapterOptions, "agentToken" | "appId" | "appSlug" | "arcApiUrl" | "serverName">): ArcMcpAdapter;
|
|
93
|
+
get serverName(): string;
|
|
94
|
+
safeConfig(): Record<string, unknown>;
|
|
95
|
+
listTools(): Promise<ArcMcpToolDefinition[]>;
|
|
96
|
+
callTool(name: string, input: unknown, options?: ArcMcpToolCallOptions): Promise<ArcMcpInvocationResult>;
|
|
97
|
+
createMcpServer(): ArcMcpJsonRpcServer;
|
|
98
|
+
startStdio(input?: NodeJS.ReadStream & {
|
|
99
|
+
fd: 0;
|
|
100
|
+
}, output?: NodeJS.WriteStream & {
|
|
101
|
+
fd: 1;
|
|
102
|
+
}): Promise<void>;
|
|
103
|
+
private loadActions;
|
|
104
|
+
private loadRuntimeActions;
|
|
105
|
+
private requiredConfig;
|
|
106
|
+
private requiredInvokeConfig;
|
|
107
|
+
}
|
|
108
|
+
export declare class ArcMcpJsonRpcServer {
|
|
109
|
+
private readonly adapter;
|
|
110
|
+
constructor(adapter: ArcMcpAdapter);
|
|
111
|
+
handleMessage(message: unknown): Promise<JsonRpcResponse | null>;
|
|
112
|
+
startStdio(input?: NodeJS.ReadStream & {
|
|
113
|
+
fd: 0;
|
|
114
|
+
}, output?: NodeJS.WriteStream & {
|
|
115
|
+
fd: 1;
|
|
116
|
+
}): Promise<void>;
|
|
117
|
+
private handleToolCall;
|
|
118
|
+
}
|
|
119
|
+
export declare function arcActionToMcpTool(action: ArcMcpActionDefinition): ArcMcpToolDefinition;
|
|
120
|
+
export declare function invocationResponseToMcpResult(response: unknown, idempotencyKey: string): ArcMcpInvocationResult;
|
|
121
|
+
export declare function mcpResult(result: ArcMcpInvocationResult): McpCallToolResult;
|
|
122
|
+
export declare function redactSecrets(value: string): string;
|
|
123
|
+
export declare function main(argv?: string[], env?: NodeJS.ProcessEnv, io?: {
|
|
124
|
+
stderr: Pick<NodeJS.WriteStream, "write">;
|
|
125
|
+
stdout: Pick<NodeJS.WriteStream, "write">;
|
|
126
|
+
}): Promise<number>;
|
|
127
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { stdin as defaultStdin, stdout as defaultStdout, stderr as defaultStderr } from "node:process";
|
|
4
|
+
const defaultArcApiUrl = "http://127.0.0.1:4000";
|
|
5
|
+
const defaultServerName = "arc-mcp";
|
|
6
|
+
const protocolVersion = "2025-03-26";
|
|
7
|
+
const secretPatterns = [
|
|
8
|
+
/\barc_agent_[A-Za-z0-9_-]{8,}/gu,
|
|
9
|
+
/\bBearer\s+[A-Za-z0-9._~+/=-]{8,}/giu,
|
|
10
|
+
/\b-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/gu
|
|
11
|
+
];
|
|
12
|
+
export class ArcMcpError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
constructor(code, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.name = "ArcMcpError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class ArcMcpConfigurationError extends ArcMcpError {
|
|
21
|
+
constructor(message) {
|
|
22
|
+
super("missing_config", message);
|
|
23
|
+
this.name = "ArcMcpConfigurationError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
class ArcHttpError extends Error {
|
|
27
|
+
status;
|
|
28
|
+
code;
|
|
29
|
+
responseBody;
|
|
30
|
+
constructor(status, code, message, responseBody) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.status = status;
|
|
33
|
+
this.code = code;
|
|
34
|
+
this.responseBody = responseBody;
|
|
35
|
+
this.name = "ArcHttpError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
class ArcAgentRuntimeClient {
|
|
39
|
+
options;
|
|
40
|
+
fetchImpl;
|
|
41
|
+
constructor(options = {}) {
|
|
42
|
+
this.options = options;
|
|
43
|
+
this.fetchImpl = options.fetch ?? fetch;
|
|
44
|
+
}
|
|
45
|
+
async invoke(input) {
|
|
46
|
+
return this.request("POST", "/v1/agent/invocations", {
|
|
47
|
+
action_key: input.action_key,
|
|
48
|
+
app_id: input.app_id,
|
|
49
|
+
app_slug: input.app_slug,
|
|
50
|
+
idempotency_key: input.idempotency_key,
|
|
51
|
+
input: input.input
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async listApps() {
|
|
55
|
+
const response = await this.request("GET", "/v1/agent/apps");
|
|
56
|
+
const data = asRecord(asRecord(response, "Arc apps response was invalid.").data, "Arc apps response was invalid.");
|
|
57
|
+
const apps = data.apps;
|
|
58
|
+
if (!Array.isArray(apps)) {
|
|
59
|
+
throw new ArcMcpError("invalid_arc_response", "Arc apps response was invalid.");
|
|
60
|
+
}
|
|
61
|
+
return apps.map((app) => asRecord(app, "Arc app response was invalid."));
|
|
62
|
+
}
|
|
63
|
+
async listActions(appId) {
|
|
64
|
+
return this.request("GET", `/v1/agent/apps/${encodeURIComponent(appId)}/actions`);
|
|
65
|
+
}
|
|
66
|
+
async request(method, path, body) {
|
|
67
|
+
if (!this.options.agentToken) {
|
|
68
|
+
throw new ArcMcpConfigurationError("ARC_AGENT_TOKEN is required.");
|
|
69
|
+
}
|
|
70
|
+
return requestJson({
|
|
71
|
+
baseUrl: this.options.baseUrl,
|
|
72
|
+
body,
|
|
73
|
+
fetchImpl: this.fetchImpl,
|
|
74
|
+
headers: {
|
|
75
|
+
authorization: `Bearer ${this.options.agentToken}`
|
|
76
|
+
},
|
|
77
|
+
method,
|
|
78
|
+
path
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class ArcMcpAdapter {
|
|
83
|
+
options;
|
|
84
|
+
client;
|
|
85
|
+
configuredActions;
|
|
86
|
+
idempotencyKeyFactory;
|
|
87
|
+
constructor(options = {}) {
|
|
88
|
+
this.options = options;
|
|
89
|
+
this.client = new ArcAgentRuntimeClient({
|
|
90
|
+
agentToken: options.agentToken,
|
|
91
|
+
baseUrl: options.arcApiUrl,
|
|
92
|
+
fetch: options.fetch
|
|
93
|
+
});
|
|
94
|
+
this.configuredActions = options.actions ? normalizeActionSource(options.actions) : null;
|
|
95
|
+
this.idempotencyKeyFactory = options.idempotencyKeyFactory ?? randomUUID;
|
|
96
|
+
}
|
|
97
|
+
static fromEnv(env = process.env, overrides = {}) {
|
|
98
|
+
return new ArcMcpAdapter({
|
|
99
|
+
...overrides,
|
|
100
|
+
agentToken: env.ARC_AGENT_TOKEN,
|
|
101
|
+
appId: env.ARC_APP_ID,
|
|
102
|
+
appSlug: env.ARC_APP_SLUG,
|
|
103
|
+
arcApiUrl: env.ARC_API_URL,
|
|
104
|
+
serverName: env.ARC_MCP_SERVER_NAME
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
get serverName() {
|
|
108
|
+
return this.options.serverName?.trim() || defaultServerName;
|
|
109
|
+
}
|
|
110
|
+
safeConfig() {
|
|
111
|
+
return {
|
|
112
|
+
ARC_AGENT_TOKEN: this.options.agentToken ? "[configured]" : "[missing]",
|
|
113
|
+
ARC_API_URL: this.options.arcApiUrl ?? defaultArcApiUrl,
|
|
114
|
+
ARC_APP_ID: this.options.appId ?? null,
|
|
115
|
+
ARC_APP_SLUG: this.options.appSlug ?? null,
|
|
116
|
+
ARC_MCP_SERVER_NAME: this.serverName
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async listTools() {
|
|
120
|
+
const actions = await this.loadActions();
|
|
121
|
+
return actions.map(arcActionToMcpTool);
|
|
122
|
+
}
|
|
123
|
+
async callTool(name, input, options = {}) {
|
|
124
|
+
const actions = await this.loadActions();
|
|
125
|
+
const action = actions.find((item) => item.key === name);
|
|
126
|
+
if (!action) {
|
|
127
|
+
throw new ArcMcpError("unknown_tool", `Arc action is not exposed as an MCP tool: ${name}`);
|
|
128
|
+
}
|
|
129
|
+
if (!isPlainObject(input)) {
|
|
130
|
+
throw new ArcMcpError("invalid_input", "MCP tool arguments must be a JSON object.");
|
|
131
|
+
}
|
|
132
|
+
const config = this.requiredInvokeConfig();
|
|
133
|
+
const idempotencyKey = options.idempotencyKey ?? this.idempotencyKeyFactory();
|
|
134
|
+
let response;
|
|
135
|
+
try {
|
|
136
|
+
response = await this.client.invoke({
|
|
137
|
+
action_key: action.key,
|
|
138
|
+
app_id: config.appId,
|
|
139
|
+
app_slug: config.appSlug,
|
|
140
|
+
idempotency_key: idempotencyKey,
|
|
141
|
+
input
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new ArcMcpError("arc_unavailable", safeArcFailureMessage(error));
|
|
146
|
+
}
|
|
147
|
+
return invocationResponseToMcpResult(response, idempotencyKey);
|
|
148
|
+
}
|
|
149
|
+
createMcpServer() {
|
|
150
|
+
return new ArcMcpJsonRpcServer(this);
|
|
151
|
+
}
|
|
152
|
+
async startStdio(input = defaultStdin, output = defaultStdout) {
|
|
153
|
+
await this.createMcpServer().startStdio(input, output);
|
|
154
|
+
}
|
|
155
|
+
async loadActions() {
|
|
156
|
+
try {
|
|
157
|
+
const runtimeActions = await this.loadRuntimeActions();
|
|
158
|
+
if (!this.configuredActions) {
|
|
159
|
+
return runtimeActions;
|
|
160
|
+
}
|
|
161
|
+
const configuredByKey = new Map(this.configuredActions
|
|
162
|
+
.filter((action) => action.enabled !== false)
|
|
163
|
+
.map((action) => [action.key, action]));
|
|
164
|
+
return runtimeActions
|
|
165
|
+
.filter((action) => configuredByKey.has(action.key))
|
|
166
|
+
.map((action) => ({
|
|
167
|
+
...configuredByKey.get(action.key),
|
|
168
|
+
...action
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error instanceof ArcMcpConfigurationError) {
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
throw new ArcMcpError("arc_unavailable", safeArcFailureMessage(error));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async loadRuntimeActions() {
|
|
179
|
+
const config = await this.requiredConfig();
|
|
180
|
+
const response = await this.client.listActions(config.appId);
|
|
181
|
+
return parseActionListResponse(response);
|
|
182
|
+
}
|
|
183
|
+
async requiredConfig() {
|
|
184
|
+
if (!this.options.agentToken) {
|
|
185
|
+
throw new ArcMcpConfigurationError("ARC_AGENT_TOKEN is required.");
|
|
186
|
+
}
|
|
187
|
+
if (!this.options.appId && !this.options.appSlug) {
|
|
188
|
+
throw new ArcMcpConfigurationError("ARC_APP_ID or ARC_APP_SLUG is required.");
|
|
189
|
+
}
|
|
190
|
+
if (this.options.appId) {
|
|
191
|
+
return {
|
|
192
|
+
appId: this.options.appId
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const apps = await this.client.listApps();
|
|
196
|
+
const app = apps.find((item) => item.slug === this.options.appSlug || item.id === this.options.appSlug);
|
|
197
|
+
if (!app) {
|
|
198
|
+
throw new ArcMcpConfigurationError("Configured Arc app is not granted to this agent.");
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
appId: app.id
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
requiredInvokeConfig() {
|
|
205
|
+
if (!this.options.agentToken) {
|
|
206
|
+
throw new ArcMcpConfigurationError("ARC_AGENT_TOKEN is required.");
|
|
207
|
+
}
|
|
208
|
+
if (!this.options.appId && !this.options.appSlug) {
|
|
209
|
+
throw new ArcMcpConfigurationError("ARC_APP_ID or ARC_APP_SLUG is required.");
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
appId: this.options.appId,
|
|
213
|
+
appSlug: this.options.appSlug
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
export class ArcMcpJsonRpcServer {
|
|
218
|
+
adapter;
|
|
219
|
+
constructor(adapter) {
|
|
220
|
+
this.adapter = adapter;
|
|
221
|
+
}
|
|
222
|
+
async handleMessage(message) {
|
|
223
|
+
const request = asJsonRpcRequest(message);
|
|
224
|
+
if (!request.id && request.method?.startsWith("notifications/")) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
const id = request.id ?? null;
|
|
228
|
+
try {
|
|
229
|
+
switch (request.method) {
|
|
230
|
+
case "initialize":
|
|
231
|
+
return ok(id, {
|
|
232
|
+
capabilities: {
|
|
233
|
+
tools: {
|
|
234
|
+
listChanged: false
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
protocolVersion,
|
|
238
|
+
serverInfo: {
|
|
239
|
+
name: this.adapter.serverName,
|
|
240
|
+
version: "0.1.0"
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
case "ping":
|
|
244
|
+
return ok(id, {});
|
|
245
|
+
case "tools/list":
|
|
246
|
+
return ok(id, {
|
|
247
|
+
tools: await this.adapter.listTools()
|
|
248
|
+
});
|
|
249
|
+
case "tools/call":
|
|
250
|
+
return ok(id, await this.handleToolCall(request.params));
|
|
251
|
+
default:
|
|
252
|
+
return fail(id, -32601, "MCP method is not supported by Arc.");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
return fail(id, -32000, redactSecrets(error instanceof Error ? error.message : "Arc MCP failed closed."));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async startStdio(input = defaultStdin, output = defaultStdout) {
|
|
260
|
+
const lines = createInterface({
|
|
261
|
+
crlfDelay: Infinity,
|
|
262
|
+
input
|
|
263
|
+
});
|
|
264
|
+
for await (const line of lines) {
|
|
265
|
+
if (!line.trim()) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
let parsed;
|
|
269
|
+
try {
|
|
270
|
+
parsed = JSON.parse(line);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
output.write(`${JSON.stringify(fail(null, -32700, "Invalid JSON-RPC message."))}\n`);
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const response = await this.handleMessage(parsed);
|
|
277
|
+
if (response) {
|
|
278
|
+
output.write(`${JSON.stringify(response)}\n`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async handleToolCall(params) {
|
|
283
|
+
const record = asRecord(params, "MCP tools/call params must be an object.");
|
|
284
|
+
const name = readString(record.name, "MCP tools/call params.name is required.");
|
|
285
|
+
const argumentsValue = record.arguments ?? {};
|
|
286
|
+
const idempotencyKey = readIdempotencyKey(record._meta);
|
|
287
|
+
try {
|
|
288
|
+
const result = await this.adapter.callTool(name, argumentsValue, {
|
|
289
|
+
idempotencyKey
|
|
290
|
+
});
|
|
291
|
+
return mcpResult(result);
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
const message = redactSecrets(error instanceof Error ? error.message : "Arc MCP failed closed.");
|
|
295
|
+
return {
|
|
296
|
+
content: [
|
|
297
|
+
{
|
|
298
|
+
text: `Arc MCP adapter failed closed: ${message}`,
|
|
299
|
+
type: "text"
|
|
300
|
+
}
|
|
301
|
+
],
|
|
302
|
+
isError: true,
|
|
303
|
+
structuredContent: {
|
|
304
|
+
code: error instanceof ArcMcpError ? error.code : "arc_mcp_error",
|
|
305
|
+
status: "error"
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export function arcActionToMcpTool(action) {
|
|
312
|
+
const description = [
|
|
313
|
+
action.description?.trim(),
|
|
314
|
+
`Arc risk: ${action.risk_level}. Default Arc decision: ${action.default_decision}.`
|
|
315
|
+
]
|
|
316
|
+
.filter(Boolean)
|
|
317
|
+
.join("\n\n");
|
|
318
|
+
return {
|
|
319
|
+
description,
|
|
320
|
+
inputSchema: normalizeInputSchema(action.input_schema),
|
|
321
|
+
name: action.key,
|
|
322
|
+
title: action.name
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
export function invocationResponseToMcpResult(response, idempotencyKey) {
|
|
326
|
+
const envelope = parseInvocationResponse(response);
|
|
327
|
+
const data = envelope.data;
|
|
328
|
+
const invocationId = data.invocation?.id ?? null;
|
|
329
|
+
const decision = data.decision?.decision ?? data.invocation?.decision ?? null;
|
|
330
|
+
const status = data.status ?? data.invocation?.status ?? null;
|
|
331
|
+
const invocationStatus = data.invocation?.status ?? null;
|
|
332
|
+
const approvalId = data.approval?.id ?? null;
|
|
333
|
+
if (decision === "ask") {
|
|
334
|
+
return {
|
|
335
|
+
approval_id: approvalId,
|
|
336
|
+
decision,
|
|
337
|
+
idempotency_key: idempotencyKey,
|
|
338
|
+
invocation_id: invocationId,
|
|
339
|
+
message: "This action requires approval in Arc.",
|
|
340
|
+
result: null,
|
|
341
|
+
status: "pending_approval"
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
if (decision === "block") {
|
|
345
|
+
return {
|
|
346
|
+
approval_id: null,
|
|
347
|
+
decision,
|
|
348
|
+
idempotency_key: idempotencyKey,
|
|
349
|
+
invocation_id: invocationId,
|
|
350
|
+
message: "Arc blocked this action by policy.",
|
|
351
|
+
result: null,
|
|
352
|
+
status: "blocked"
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
if (decision !== "allow") {
|
|
356
|
+
return failClosedInvocationResult({
|
|
357
|
+
decision,
|
|
358
|
+
idempotencyKey,
|
|
359
|
+
invocationId,
|
|
360
|
+
message: "Arc returned an unknown policy decision; action was not treated as allowed."
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
if (!status || (invocationStatus && status !== invocationStatus)) {
|
|
364
|
+
return failClosedInvocationResult({
|
|
365
|
+
decision,
|
|
366
|
+
idempotencyKey,
|
|
367
|
+
invocationId,
|
|
368
|
+
message: "Arc returned an incomplete or inconsistent invocation status; action was not treated as allowed."
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
if (status === "execution_succeeded") {
|
|
372
|
+
return {
|
|
373
|
+
approval_id: null,
|
|
374
|
+
decision,
|
|
375
|
+
idempotency_key: idempotencyKey,
|
|
376
|
+
invocation_id: invocationId,
|
|
377
|
+
message: "Arc allowed and completed this action through signed execution.",
|
|
378
|
+
result: data.invocation?.result_redacted ?? null,
|
|
379
|
+
status: "executed"
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
if (status !== "queued_for_execution") {
|
|
383
|
+
return failClosedInvocationResult({
|
|
384
|
+
decision,
|
|
385
|
+
idempotencyKey,
|
|
386
|
+
invocationId,
|
|
387
|
+
message: "Arc returned an unknown invocation status; action was not treated as allowed."
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
approval_id: null,
|
|
392
|
+
decision,
|
|
393
|
+
idempotency_key: idempotencyKey,
|
|
394
|
+
invocation_id: invocationId,
|
|
395
|
+
message: "Arc allowed this action and queued it for signed execution.",
|
|
396
|
+
result: null,
|
|
397
|
+
status: "queued"
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
export function mcpResult(result) {
|
|
401
|
+
return {
|
|
402
|
+
content: [
|
|
403
|
+
{
|
|
404
|
+
text: result.message,
|
|
405
|
+
type: "text"
|
|
406
|
+
}
|
|
407
|
+
],
|
|
408
|
+
isError: result.status === "error" ? true : undefined,
|
|
409
|
+
structuredContent: result
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
function failClosedInvocationResult(input) {
|
|
413
|
+
return {
|
|
414
|
+
approval_id: null,
|
|
415
|
+
decision: input.decision,
|
|
416
|
+
idempotency_key: input.idempotencyKey,
|
|
417
|
+
invocation_id: input.invocationId,
|
|
418
|
+
message: input.message,
|
|
419
|
+
result: null,
|
|
420
|
+
status: "error"
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
export function redactSecrets(value) {
|
|
424
|
+
return secretPatterns.reduce((current, pattern) => current.replace(pattern, "[REDACTED]"), value);
|
|
425
|
+
}
|
|
426
|
+
export async function main(argv = process.argv.slice(2), env = process.env, io = {
|
|
427
|
+
stderr: defaultStderr,
|
|
428
|
+
stdout: defaultStdout
|
|
429
|
+
}) {
|
|
430
|
+
const [command = "start"] = argv;
|
|
431
|
+
const adapter = ArcMcpAdapter.fromEnv(env);
|
|
432
|
+
try {
|
|
433
|
+
if (command === "config") {
|
|
434
|
+
io.stdout.write(`${JSON.stringify(adapter.safeConfig(), null, 2)}\n`);
|
|
435
|
+
return 0;
|
|
436
|
+
}
|
|
437
|
+
if (command === "start") {
|
|
438
|
+
await adapter.startStdio();
|
|
439
|
+
return 0;
|
|
440
|
+
}
|
|
441
|
+
io.stderr.write("Usage: arc-mcp-adapter [config|start]\n");
|
|
442
|
+
return 1;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
io.stderr.write(`${redactSecrets(error instanceof Error ? error.message : "Arc MCP failed closed.")}\n`);
|
|
446
|
+
return 1;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function normalizeActionSource(source) {
|
|
450
|
+
if (Array.isArray(source)) {
|
|
451
|
+
return source.map(normalizeActionDefinition);
|
|
452
|
+
}
|
|
453
|
+
return Object.entries(source).map(([key, action]) => {
|
|
454
|
+
if (isArcMcpActionDefinition(action)) {
|
|
455
|
+
return normalizeActionDefinition({
|
|
456
|
+
...action,
|
|
457
|
+
key: action.key || key
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
return normalizeActionDefinition({
|
|
461
|
+
default_decision: action.defaultDecision,
|
|
462
|
+
description: action.description ?? null,
|
|
463
|
+
enabled: action.enabled ?? true,
|
|
464
|
+
input_schema: action.input,
|
|
465
|
+
key,
|
|
466
|
+
name: action.name,
|
|
467
|
+
risk_level: action.risk
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
function normalizeActionDefinition(action) {
|
|
472
|
+
return {
|
|
473
|
+
app_id: action.app_id,
|
|
474
|
+
default_decision: action.default_decision,
|
|
475
|
+
description: action.description ?? null,
|
|
476
|
+
enabled: action.enabled,
|
|
477
|
+
input_schema: normalizeInputSchema(action.input_schema),
|
|
478
|
+
key: action.key,
|
|
479
|
+
name: action.name,
|
|
480
|
+
risk_level: action.risk_level
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
function isArcMcpActionDefinition(action) {
|
|
484
|
+
return "input_schema" in action;
|
|
485
|
+
}
|
|
486
|
+
function normalizeInputSchema(schema) {
|
|
487
|
+
const copy = cloneJsonObject(schema);
|
|
488
|
+
if (copy.type === undefined) {
|
|
489
|
+
copy.type = "object";
|
|
490
|
+
}
|
|
491
|
+
if (copy.properties === undefined && copy.type === "object") {
|
|
492
|
+
copy.properties = {};
|
|
493
|
+
}
|
|
494
|
+
return copy;
|
|
495
|
+
}
|
|
496
|
+
function parseActionListResponse(response) {
|
|
497
|
+
const data = asRecord(asRecord(response, "Arc actions response was invalid.").data, "Arc actions response was invalid.");
|
|
498
|
+
const actions = data.actions;
|
|
499
|
+
if (!Array.isArray(actions)) {
|
|
500
|
+
throw new ArcMcpError("invalid_arc_response", "Arc actions response was invalid.");
|
|
501
|
+
}
|
|
502
|
+
return actions.map((action) => normalizeActionDefinition(asRecord(action, "Arc action response was invalid.")));
|
|
503
|
+
}
|
|
504
|
+
function parseInvocationResponse(response) {
|
|
505
|
+
const record = asRecord(response, "Arc invocation response was invalid.");
|
|
506
|
+
const data = asRecord(record.data, "Arc invocation response was invalid.");
|
|
507
|
+
return {
|
|
508
|
+
data: {
|
|
509
|
+
approval: maybeRecord(data.approval),
|
|
510
|
+
decision: maybeRecord(data.decision),
|
|
511
|
+
invocation: maybeRecord(data.invocation),
|
|
512
|
+
replayed: typeof data.replayed === "boolean" ? data.replayed : undefined,
|
|
513
|
+
status: typeof data.status === "string" ? data.status : undefined
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
function safeArcFailureMessage(error) {
|
|
518
|
+
if (error instanceof ArcMcpError) {
|
|
519
|
+
return error.message;
|
|
520
|
+
}
|
|
521
|
+
if (error instanceof ArcHttpError) {
|
|
522
|
+
return redactSecrets(`Arc rejected the request (${error.status} ${error.code}).`);
|
|
523
|
+
}
|
|
524
|
+
if (error instanceof Error) {
|
|
525
|
+
return redactSecrets(`Arc is unavailable; action was not sent. ${error.message}`);
|
|
526
|
+
}
|
|
527
|
+
return "Arc is unavailable; action was not sent.";
|
|
528
|
+
}
|
|
529
|
+
async function requestJson(input) {
|
|
530
|
+
const response = await input.fetchImpl(buildUrl(input.baseUrl, input.path), {
|
|
531
|
+
body: input.body === undefined ? undefined : JSON.stringify(input.body),
|
|
532
|
+
headers: {
|
|
533
|
+
accept: "application/json",
|
|
534
|
+
...(input.body === undefined ? {} : { "content-type": "application/json" }),
|
|
535
|
+
...input.headers
|
|
536
|
+
},
|
|
537
|
+
method: input.method
|
|
538
|
+
});
|
|
539
|
+
const text = await response.text();
|
|
540
|
+
const value = text ? parseJsonResponse(text) : null;
|
|
541
|
+
if (!response.ok) {
|
|
542
|
+
const serverError = asServerError(value);
|
|
543
|
+
throw new ArcHttpError(response.status, serverError.code, serverError.message, value);
|
|
544
|
+
}
|
|
545
|
+
return value;
|
|
546
|
+
}
|
|
547
|
+
function buildUrl(baseUrl, path) {
|
|
548
|
+
if (/^https?:\/\//u.test(path)) {
|
|
549
|
+
return path;
|
|
550
|
+
}
|
|
551
|
+
return `${trimTrailingSlash(baseUrl ?? defaultArcApiUrl)}${path.startsWith("/") ? path : `/${path}`}`;
|
|
552
|
+
}
|
|
553
|
+
function parseJsonResponse(text) {
|
|
554
|
+
try {
|
|
555
|
+
return JSON.parse(text);
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
throw new ArcMcpError("invalid_arc_response", "Arc response was not valid JSON.");
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
function asServerError(value) {
|
|
562
|
+
if (isPlainObject(value) &&
|
|
563
|
+
isPlainObject(value.error) &&
|
|
564
|
+
typeof value.error.code === "string" &&
|
|
565
|
+
typeof value.error.message === "string") {
|
|
566
|
+
return {
|
|
567
|
+
code: value.error.code,
|
|
568
|
+
message: value.error.message
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
return {
|
|
572
|
+
code: "request_failed",
|
|
573
|
+
message: "Arc request failed."
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
function readIdempotencyKey(meta) {
|
|
577
|
+
const record = maybeRecord(meta);
|
|
578
|
+
const value = record?.arc_idempotency_key ?? record?.["arc/idempotency-key"];
|
|
579
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
580
|
+
}
|
|
581
|
+
function asJsonRpcRequest(message) {
|
|
582
|
+
const record = asRecord(message, "Invalid JSON-RPC request.");
|
|
583
|
+
return record;
|
|
584
|
+
}
|
|
585
|
+
function asRecord(value, message) {
|
|
586
|
+
if (!isPlainObject(value)) {
|
|
587
|
+
throw new ArcMcpError("invalid_request", message);
|
|
588
|
+
}
|
|
589
|
+
return value;
|
|
590
|
+
}
|
|
591
|
+
function maybeRecord(value) {
|
|
592
|
+
return isPlainObject(value) ? value : null;
|
|
593
|
+
}
|
|
594
|
+
function readString(value, message) {
|
|
595
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
596
|
+
throw new ArcMcpError("invalid_request", message);
|
|
597
|
+
}
|
|
598
|
+
return value.trim();
|
|
599
|
+
}
|
|
600
|
+
function isPlainObject(value) {
|
|
601
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
602
|
+
}
|
|
603
|
+
function cloneJsonObject(value) {
|
|
604
|
+
return JSON.parse(JSON.stringify(value));
|
|
605
|
+
}
|
|
606
|
+
function trimTrailingSlash(value) {
|
|
607
|
+
return value.replace(/\/+$/u, "");
|
|
608
|
+
}
|
|
609
|
+
function ok(id, result) {
|
|
610
|
+
return {
|
|
611
|
+
id,
|
|
612
|
+
jsonrpc: "2.0",
|
|
613
|
+
result
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
function fail(id, code, message) {
|
|
617
|
+
return {
|
|
618
|
+
error: {
|
|
619
|
+
code,
|
|
620
|
+
message
|
|
621
|
+
},
|
|
622
|
+
id,
|
|
623
|
+
jsonrpc: "2.0"
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@geostack/arc-mcp-adapter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "MCP transport adapter for exposing Arc-protected actions as MCP tools.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"arc-mcp-adapter": "./dist/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/cli.js",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
24
|
+
"test": "node --import tsx --test test/*.test.ts"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
}
|
|
29
|
+
}
|