@carbonstopper/agent-mcp 0.1.4 → 0.1.5

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/AGENTS.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
- This is a stdio MCP server for Carbonstop server-side Agent usage. It wraps Java internal Agent APIs through gateway service prefixes:
5
+ This is an MCP server for Carbonstop server-side Agent usage. It supports stdio for local MCP clients and Streamable HTTP for deployed Agent services. It wraps Java internal Agent APIs through gateway service prefixes:
6
6
 
7
7
  - `/ai/agent/internal/platform/**`
8
8
  - `/footprint3/agent/internal/skills/**`
@@ -16,13 +16,20 @@ The MCP process reads:
16
16
  - `CARBONSTOP_AGENT_BASE_URL`
17
17
  - `CARBONSTOP_AGENT_INTERNAL_KEY`
18
18
  - `CARBONSTOP_TIMEOUT`
19
+ - `CARBONSTOP_MCP_TRANSPORT`
20
+ - `CARBONSTOP_MCP_HTTP_HOST`
21
+ - `CARBONSTOP_MCP_HTTP_PORT`
22
+ - `CARBONSTOP_MCP_HTTP_PATH`
23
+ - `CARBONSTOP_MCP_HTTP_TOKEN`
19
24
 
20
25
  Each tool call must include `sessionId`. The HTTP client forwards it in both `X-Agent-Session-Id` and the JSON body.
21
26
 
22
27
  ## Architecture
23
28
 
24
29
  ```text
25
- src/index.ts MCP server entry and tool registration
30
+ src/index.ts CLI entry and transport selection
31
+ src/server.ts MCP server factory and tool registration
32
+ src/http.ts Streamable HTTP transport server
26
33
  src/tools.ts Zod schemas, descriptions, route mapping, body builder
27
34
  src/client.ts HTTP client with retry and Agent internal headers
28
35
  src/config.ts environment loading
@@ -34,7 +41,7 @@ src/version.ts version info
34
41
 
35
42
  - Platform context and memory: `session_context`, `project_memory_get`, `project_memory_patch`, `project_memory_compress`
36
43
  - Product carbon skills: `modeling_preview`, `modeling_execute`, `modeling_re_modeling`, `modeling_update`, `modeling_detail`
37
- - Report skills: `report_generate`, `report_detail`
44
+ - Report skills: `report_generate`, `report_regenerate`, `report_detail`
38
45
  - Support skills: `analysis_run`, `factor_search`, `knowledge_search`
39
46
 
40
47
  Write or high-risk tools require `idempotencyKey`.
package/README.md CHANGED
@@ -15,7 +15,27 @@ npm install -g @carbonstopper/agent-mcp
15
15
  Or run directly:
16
16
 
17
17
  ```bash
18
- npx @carbonstopper/agent-mcp
18
+ # stdio mode
19
+ npx @carbonstopper/agent-mcp --stdio
20
+
21
+ # Streamable HTTP mode
22
+ npx @carbonstopper/agent-mcp --http --port 3000
23
+ ```
24
+
25
+ The default transport is stdio. For deployed Agent services, start Streamable HTTP mode:
26
+
27
+ ```bash
28
+ npx @carbonstopper/agent-mcp --http --port 3000 --path /mcp
29
+ ```
30
+
31
+ After global install:
32
+
33
+ ```bash
34
+ # stdio mode
35
+ carbonstop-agent-mcp --stdio
36
+
37
+ # Streamable HTTP mode
38
+ carbonstop-agent-mcp --http --port 3000
19
39
  ```
20
40
 
21
41
  ## Quick Start
@@ -40,6 +60,40 @@ export CARBONSTOP_AGENT_BASE_URL="https://your-gateway-host"
40
60
 
41
61
  `CARBONSTOP_BASE_URL` is also accepted as a compatibility fallback.
42
62
 
63
+ ### Streamable HTTP
64
+
65
+ Use Streamable HTTP when a LangChain/LangGraph Agent should call the MCP server by URL instead of spawning a local `npx` process.
66
+
67
+ ```bash
68
+ export CARBONSTOP_AGENT_INTERNAL_KEY="your-agent-internal-key"
69
+ export CARBONSTOP_AGENT_BASE_URL="https://your-gateway-host"
70
+ export CARBONSTOP_MCP_TRANSPORT="http"
71
+ export CARBONSTOP_MCP_HTTP_HOST="0.0.0.0"
72
+ export CARBONSTOP_MCP_HTTP_PORT="3000"
73
+ export CARBONSTOP_MCP_HTTP_PATH="/mcp"
74
+ export CARBONSTOP_MCP_HTTP_TOKEN="optional-mcp-access-token"
75
+
76
+ npx @carbonstopper/agent-mcp
77
+ ```
78
+
79
+ LangChain MCP configuration:
80
+
81
+ ```python
82
+ from langchain_mcp_adapters.client import MultiServerMCPClient
83
+
84
+ client = MultiServerMCPClient({
85
+ "carbonstop-agent": {
86
+ "transport": "streamable_http",
87
+ "url": "https://your-domain.com/mcp",
88
+ "headers": {
89
+ "Authorization": "Bearer optional-mcp-access-token"
90
+ }
91
+ }
92
+ })
93
+ ```
94
+
95
+ If `CARBONSTOP_MCP_HTTP_TOKEN` is not set, the MCP HTTP endpoint does not require a token. Prefer private networking or a token for deployed services.
96
+
43
97
  ## MCP Client Config
44
98
 
45
99
  ### Claude Code / Claude Desktop
@@ -103,6 +157,7 @@ For local debugging against a non-default gateway, add:
103
157
  | `modeling_update` | Supplement or update emission sources for an existing model. Requires `accountId` and `idempotencyKey`. |
104
158
  | `modeling_detail` | Get product carbon model details. |
105
159
  | `report_generate` | Generate a product carbon report. Requires `idempotencyKey`. |
160
+ | `report_regenerate` | Regenerate an existing product carbon report. Requires `reportId` and `idempotencyKey`. |
106
161
  | `report_detail` | Get product carbon report detail and latest report URL. |
107
162
  | `analysis_run` | Run product carbon analysis. |
108
163
  | `factor_search` | Search and match carbon emission factors. |
@@ -140,6 +195,7 @@ Write or high-risk tools require `idempotencyKey`, especially:
140
195
  - `modeling_re_modeling`
141
196
  - `modeling_update`
142
197
  - `report_generate`
198
+ - `report_regenerate`
143
199
  - `project_memory_patch`
144
200
  - `project_memory_compress`
145
201
 
package/dist/client.js CHANGED
@@ -1,4 +1,5 @@
1
- const userAgent = "carbonstop-agent-mcp/0.1.0";
1
+ import { Version } from "./version.js";
2
+ const userAgent = `carbonstop-agent-mcp/${Version}`;
2
3
  const maxRetries = 3;
3
4
  const baseBackoff = 1000;
4
5
  export class Client {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Config } from "./config.js";
2
+ export interface HttpOptions {
3
+ host: string;
4
+ port: number;
5
+ path: string;
6
+ token?: string;
7
+ }
8
+ export declare function runHttpServer(config: Config, options: HttpOptions): Promise<void>;
package/dist/http.js ADDED
@@ -0,0 +1,106 @@
1
+ import { createServer } from "node:http";
2
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
+ import { createAgentMcpServer } from "./server.js";
4
+ function sendJson(res, status, value) {
5
+ if (res.headersSent)
6
+ return;
7
+ res.writeHead(status, { "Content-Type": "application/json;charset=utf-8" });
8
+ res.end(JSON.stringify(value));
9
+ }
10
+ function normalizePath(path) {
11
+ const withSlash = path.startsWith("/") ? path : `/${path}`;
12
+ return withSlash.length > 1 ? withSlash.replace(/\/+$/, "") : withSlash;
13
+ }
14
+ function setCorsHeaders(req, res) {
15
+ const origin = req.headers.origin;
16
+ res.setHeader("Access-Control-Allow-Origin", typeof origin === "string" ? origin : "*");
17
+ res.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,OPTIONS");
18
+ res.setHeader("Access-Control-Allow-Headers", "content-type,authorization,mcp-session-id,x-mcp-token,x-carbonstop-mcp-token");
19
+ res.setHeader("Access-Control-Expose-Headers", "mcp-session-id");
20
+ }
21
+ function isAuthorized(req, token) {
22
+ if (!token)
23
+ return true;
24
+ const authHeader = req.headers.authorization;
25
+ if (typeof authHeader === "string" && authHeader === `Bearer ${token}`) {
26
+ return true;
27
+ }
28
+ const mcpToken = req.headers["x-mcp-token"];
29
+ if (typeof mcpToken === "string" && mcpToken === token) {
30
+ return true;
31
+ }
32
+ const carbonstopToken = req.headers["x-carbonstop-mcp-token"];
33
+ return typeof carbonstopToken === "string" && carbonstopToken === token;
34
+ }
35
+ export async function runHttpServer(config, options) {
36
+ const path = normalizePath(options.path);
37
+ const httpServer = createServer(async (req, res) => {
38
+ setCorsHeaders(req, res);
39
+ try {
40
+ const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
41
+ const requestPath = normalizePath(url.pathname);
42
+ if (req.method === "OPTIONS") {
43
+ res.writeHead(204);
44
+ res.end();
45
+ return;
46
+ }
47
+ if (requestPath === "/healthz") {
48
+ sendJson(res, 200, {
49
+ ok: true,
50
+ name: "carbonstop-agent-mcp",
51
+ transport: "streamable_http",
52
+ });
53
+ return;
54
+ }
55
+ if (requestPath !== path) {
56
+ sendJson(res, 404, { error: "not_found" });
57
+ return;
58
+ }
59
+ if (!isAuthorized(req, options.token)) {
60
+ sendJson(res, 401, { error: "unauthorized" });
61
+ return;
62
+ }
63
+ if (!["GET", "POST", "DELETE"].includes(req.method || "")) {
64
+ res.setHeader("Allow", "GET,POST,DELETE,OPTIONS");
65
+ sendJson(res, 405, { error: "method_not_allowed" });
66
+ return;
67
+ }
68
+ const mcpServer = createAgentMcpServer(config);
69
+ const transport = new StreamableHTTPServerTransport({
70
+ sessionIdGenerator: undefined,
71
+ });
72
+ let closed = false;
73
+ const cleanup = async () => {
74
+ if (closed)
75
+ return;
76
+ closed = true;
77
+ await transport.close();
78
+ await mcpServer.close();
79
+ };
80
+ res.on("close", () => {
81
+ void cleanup();
82
+ });
83
+ await mcpServer.connect(transport);
84
+ await transport.handleRequest(req, res);
85
+ }
86
+ catch (err) {
87
+ sendJson(res, 500, {
88
+ error: err instanceof Error ? err.message : String(err),
89
+ });
90
+ }
91
+ });
92
+ await new Promise((resolve, reject) => {
93
+ httpServer.once("error", reject);
94
+ httpServer.listen(options.port, options.host, () => {
95
+ httpServer.off("error", reject);
96
+ resolve();
97
+ });
98
+ });
99
+ console.error(`[carbonstop-agent-mcp] streamable_http listening on http://${options.host}:${options.port}${path}`);
100
+ const shutdown = async () => {
101
+ httpServer.close(() => process.exit(0));
102
+ };
103
+ process.once("SIGINT", shutdown);
104
+ process.once("SIGTERM", shutdown);
105
+ }
106
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,61 +1,50 @@
1
1
  #!/usr/bin/env node
2
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
3
  import { load } from "./config.js";
5
- import { Client } from "./client.js";
6
- import { schemas, descriptions, toolRoutes, buildBody, getSessionId } from "./tools.js";
7
- import { Version } from "./version.js";
4
+ import { runHttpServer } from "./http.js";
5
+ import { assertConfig, createAgentMcpServer } from "./server.js";
8
6
  const config = load();
9
- if (!config.baseURL) {
10
- console.error("[carbonstop-agent-mcp] CARBONSTOP_AGENT_BASE_URL is required");
11
- process.exit(2);
12
- }
13
- if (!config.agentInternalKey) {
14
- console.error("[carbonstop-agent-mcp] CARBONSTOP_AGENT_INTERNAL_KEY is required");
15
- process.exit(2);
16
- }
17
- const server = new McpServer({
18
- name: "carbonstop-agent-mcp",
19
- version: Version,
20
- });
21
- const client = new Client(config);
22
- function textContent(text) {
23
- return { content: [{ type: "text", text }] };
7
+ function readArg(name) {
8
+ const prefix = `${name}=`;
9
+ const inline = process.argv.find((arg) => arg.startsWith(prefix));
10
+ if (inline)
11
+ return inline.slice(prefix.length);
12
+ const index = process.argv.indexOf(name);
13
+ if (index >= 0 && process.argv[index + 1])
14
+ return process.argv[index + 1];
15
+ return undefined;
24
16
  }
25
- function errorContent(text) {
26
- return { content: [{ type: "text", text }], isError: true };
17
+ function hasFlag(name) {
18
+ return process.argv.includes(name);
27
19
  }
28
- for (const [name, schema] of Object.entries(schemas)) {
29
- if (!schema)
30
- continue;
31
- server.registerTool(name, {
32
- description: descriptions[name] || "",
33
- inputSchema: schema,
34
- }, async (args) => {
35
- const route = toolRoutes[name];
36
- if (!route) {
37
- return errorContent(`Unknown tool: ${name}`);
20
+ try {
21
+ assertConfig(config);
22
+ const transportMode = hasFlag("--http") ? "http" :
23
+ hasFlag("--stdio") ? "stdio" :
24
+ readArg("--transport") ||
25
+ process.env.CARBONSTOP_MCP_TRANSPORT ||
26
+ "stdio";
27
+ if (["http", "streamable_http", "streamable-http"].includes(transportMode)) {
28
+ const port = Number.parseInt(readArg("--port") || process.env.CARBONSTOP_MCP_HTTP_PORT || "3000", 10);
29
+ const host = readArg("--host") || process.env.CARBONSTOP_MCP_HTTP_HOST || "0.0.0.0";
30
+ const path = readArg("--path") || process.env.CARBONSTOP_MCP_HTTP_PATH || "/mcp";
31
+ const token = process.env.CARBONSTOP_MCP_HTTP_TOKEN || undefined;
32
+ if (!Number.isFinite(port) || port <= 0) {
33
+ throw new Error("HTTP port must be a positive number");
38
34
  }
39
- try {
40
- const sessionId = getSessionId(args);
41
- const body = buildBody(route, args);
42
- const result = await client.post(route.path, sessionId, body);
43
- if (result.status < 200 || result.status >= 300) {
44
- return errorContent(`HTTP ${result.status}\n${result.body}`);
45
- }
46
- try {
47
- const parsed = JSON.parse(result.body);
48
- return textContent(JSON.stringify(parsed, null, 2));
49
- }
50
- catch {
51
- return textContent(result.body);
52
- }
53
- }
54
- catch (err) {
55
- return errorContent(`Error: ${err instanceof Error ? err.message : String(err)}`);
56
- }
57
- });
35
+ await runHttpServer(config, { host, port, path, token });
36
+ }
37
+ else if (transportMode === "stdio") {
38
+ const server = createAgentMcpServer(config);
39
+ const transport = new StdioServerTransport();
40
+ await server.connect(transport);
41
+ }
42
+ else {
43
+ throw new Error(`Unsupported transport: ${transportMode}`);
44
+ }
45
+ }
46
+ catch (err) {
47
+ console.error(`[carbonstop-agent-mcp] ${err instanceof Error ? err.message : String(err)}`);
48
+ process.exit(2);
58
49
  }
59
- const transport = new StdioServerTransport();
60
- await server.connect(transport);
61
50
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Config } from "./config.js";
3
+ export declare function assertConfig(config: Config): void;
4
+ export declare function createAgentMcpServer(config: Config): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,58 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { Client } from "./client.js";
3
+ import { schemas, descriptions, toolRoutes, buildBody, getSessionId } from "./tools.js";
4
+ import { Version } from "./version.js";
5
+ export function assertConfig(config) {
6
+ if (!config.baseURL) {
7
+ throw new Error("CARBONSTOP_AGENT_BASE_URL is required");
8
+ }
9
+ if (!config.agentInternalKey) {
10
+ throw new Error("CARBONSTOP_AGENT_INTERNAL_KEY is required");
11
+ }
12
+ }
13
+ function textContent(text) {
14
+ return { content: [{ type: "text", text }] };
15
+ }
16
+ function errorContent(text) {
17
+ return { content: [{ type: "text", text }], isError: true };
18
+ }
19
+ export function createAgentMcpServer(config) {
20
+ const server = new McpServer({
21
+ name: "carbonstop-agent-mcp",
22
+ version: Version,
23
+ });
24
+ const client = new Client(config);
25
+ for (const [name, schema] of Object.entries(schemas)) {
26
+ if (!schema)
27
+ continue;
28
+ server.registerTool(name, {
29
+ description: descriptions[name] || "",
30
+ inputSchema: schema,
31
+ }, async (args) => {
32
+ const route = toolRoutes[name];
33
+ if (!route) {
34
+ return errorContent(`Unknown tool: ${name}`);
35
+ }
36
+ try {
37
+ const sessionId = getSessionId(args);
38
+ const body = buildBody(route, args);
39
+ const result = await client.post(route.path, sessionId, body);
40
+ if (result.status < 200 || result.status >= 300) {
41
+ return errorContent(`HTTP ${result.status}\n${result.body}`);
42
+ }
43
+ try {
44
+ const parsed = JSON.parse(result.body);
45
+ return textContent(JSON.stringify(parsed, null, 2));
46
+ }
47
+ catch {
48
+ return textContent(result.body);
49
+ }
50
+ }
51
+ catch (err) {
52
+ return errorContent(`Error: ${err instanceof Error ? err.message : String(err)}`);
53
+ }
54
+ });
55
+ }
56
+ return server;
57
+ }
58
+ //# 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/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export declare function getBaseURL(): string;
2
- export declare const Version = "0.1.0";
2
+ export declare const Version = "0.1.5";
3
3
  export declare const Commit = "none";
4
4
  export declare const BuildTime = "unknown";
package/dist/version.js CHANGED
@@ -13,7 +13,7 @@ export function getBaseURL() {
13
13
  return "";
14
14
  }
15
15
  }
16
- export const Version = "0.1.0";
16
+ export const Version = "0.1.5";
17
17
  export const Commit = "none";
18
18
  export const BuildTime = "unknown";
19
19
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carbonstopper/agent-mcp",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "MCP server for Carbonstop Agent internal skill APIs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,6 +24,7 @@
24
24
  "prebuild": "node scripts/build.cjs",
25
25
  "build": "tsc",
26
26
  "start": "node dist/index.js",
27
+ "start:http": "node dist/index.js --http",
27
28
  "dev": "tsx src/index.ts",
28
29
  "prepublishOnly": "npm run build"
29
30
  },