@cursor/july 0.1.10 → 0.1.12
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 +1 -0
- package/dist/bin/agent-serve.js +17 -3
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +2 -1
- package/dist/channels/github/types.d.ts +4 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.js +1 -1
- package/dist/channels/slack/dispatch.d.ts +13 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +36 -11
- package/dist/channels/slack/eval-directive.d.ts +63 -0
- package/dist/channels/slack/eval-directive.d.ts.map +1 -0
- package/dist/channels/slack/eval-directive.js +283 -0
- package/dist/channels/slack/index.d.ts +1 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +1 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +4 -2
- package/dist/channels/slack/types.d.ts +7 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/connections.d.ts +10 -5
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +10 -5
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.CY2buaEE.js → app.Dh_JkJjI.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.Er_R50vY.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.Ix954SFJ.js → VPLocalSearchBox.CptQNLkR.js} +1 -1
- package/dist/docs/assets/chunks/{theme.PDwuJbyi.js → theme.DWflH-LQ.js} +2 -2
- package/dist/docs/assets/{deployment.md.DC5-ImcM.js → deployment.md.TecHo0_2.js} +3 -3
- package/dist/docs/assets/{deployment.md.DC5-ImcM.lean.js → deployment.md.TecHo0_2.lean.js} +1 -1
- package/dist/docs/assets/guides_mcp-oauth.md.DqmEOQY1.js +29 -0
- package/dist/docs/assets/guides_mcp-oauth.md.DqmEOQY1.lean.js +1 -0
- package/dist/docs/assets/{index.md.COiu-1jL.js → index.md.t0TM2Qzz.js} +3 -3
- package/dist/docs/assets/{index.md.COiu-1jL.lean.js → index.md.t0TM2Qzz.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.CjfiV2Q-.js → reference_cli.md.B74NrVzb.js} +3 -3
- package/dist/docs/assets/{reference_cli.md.CjfiV2Q-.lean.js → reference_cli.md.B74NrVzb.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.FbWupyzW.js → reference_connections.md.CsSr3rDz.js} +8 -3
- package/dist/docs/assets/{reference_connections.md.FbWupyzW.lean.js → reference_connections.md.CsSr3rDz.lean.js} +1 -1
- package/dist/docs/assets/reference_prompt.md.BaiweQxE.js +1 -0
- package/dist/docs/assets/reference_prompt.md.BaiweQxE.lean.js +1 -0
- package/dist/docs/assets/{reference_tools.md.CqgJroI0.js → reference_tools.md.BRSDnTbN.js} +16 -3
- package/dist/docs/assets/{reference_tools.md.CqgJroI0.lean.js → reference_tools.md.BRSDnTbN.lean.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.DkovjS7h.js → troubleshooting.md.CmQkmnzC.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.DkovjS7h.lean.js → troubleshooting.md.CmQkmnzC.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +7 -7
- package/dist/docs/evals.html +4 -4
- package/dist/docs/example-agents/approval-buddy.html +4 -4
- package/dist/docs/example-agents/benny.html +4 -4
- package/dist/docs/example-agents/bugbot.html +4 -4
- package/dist/docs/example-agents/codebase-wiki.html +4 -4
- package/dist/docs/example-agents/codeowners-review.html +4 -4
- package/dist/docs/example-agents/concierge.html +4 -4
- package/dist/docs/example-agents/fsd.html +4 -4
- package/dist/docs/example-agents/index.html +4 -4
- package/dist/docs/example-agents/knowledge-base.html +4 -4
- package/dist/docs/example-agents/oncall.html +4 -4
- package/dist/docs/example-agents/security-reviewer.html +4 -4
- package/dist/docs/example-agents/slack-agent.html +4 -4
- package/dist/docs/example-agents/weather-agent.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/github.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +53 -0
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +6 -6
- package/dist/docs/reference/connections.html +12 -7
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +33 -0
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +5 -5
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +20 -7
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/evals.d.ts +39 -0
- package/dist/evals.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/internal/cli-mcp-oauth.d.ts +16 -0
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -0
- package/dist/internal/cli-mcp-oauth.js +194 -0
- package/dist/internal/cli-mcp.d.ts +4 -1
- package/dist/internal/cli-mcp.d.ts.map +1 -1
- package/dist/internal/cli-mcp.js +19 -1
- package/dist/internal/cursor/account-mcp.d.ts +17 -4
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +105 -17
- package/dist/internal/cursor-event-relay.d.ts +2 -0
- package/dist/internal/cursor-event-relay.d.ts.map +1 -1
- package/dist/internal/cursor-event-relay.js +3 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +64 -10
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +1 -0
- package/dist/internal/json-dir-store.js +100 -0
- package/dist/internal/logs-client.js +1 -1
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +49 -26
- package/dist/internal/mcp-oauth.d.ts +88 -0
- package/dist/internal/mcp-oauth.d.ts.map +1 -0
- package/dist/internal/mcp-oauth.js +385 -0
- package/dist/internal/resolved-connections.d.ts.map +1 -1
- package/dist/internal/resolved-connections.js +4 -1
- package/dist/internal/sdk-runner.d.ts +9 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +28 -2
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +13 -5
- package/dist/internal/session-engine.d.ts +7 -9
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +96 -64
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +2 -1
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +8 -4
- package/dist/internal/turn-governor.d.ts +54 -0
- package/dist/internal/turn-governor.d.ts.map +1 -0
- package/dist/internal/turn-governor.js +111 -0
- package/dist/playground/assets/index-1dzluIcW.js +86 -0
- package/dist/playground/assets/index-kZjeJs1v.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/prompt.d.ts +39 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +70 -0
- package/dist/types.d.ts +78 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/docs/README.md +4 -0
- package/docs/deployment.md +6 -1
- package/docs/guides/mcp-oauth.md +157 -0
- package/docs/reference/cli.md +28 -0
- package/docs/reference/connections.md +28 -0
- package/docs/reference/prompt.md +47 -0
- package/docs/reference/tools.md +21 -0
- package/docs/troubleshooting.md +11 -0
- package/package.json +9 -2
- package/skills/create-agent/SKILL.md +7 -3
- package/skills/framework-map/SKILL.md +1 -0
- package/skills/mcp-auth/SKILL.md +138 -0
- package/src/bin/agent-serve.ts +20 -3
- package/src/channels/github/github-channel.ts +2 -0
- package/src/channels/github/types.ts +4 -0
- package/src/channels/slack/cursor-account.ts +2 -0
- package/src/channels/slack/dispatch.ts +49 -0
- package/src/channels/slack/eval-directive.ts +348 -0
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/slack-channel.ts +3 -0
- package/src/channels/slack/types.ts +7 -0
- package/src/connections.ts +10 -5
- package/src/evals.ts +43 -0
- package/src/index.ts +3 -0
- package/src/internal/cli-mcp-oauth.ts +254 -0
- package/src/internal/cli-mcp.ts +25 -2
- package/src/internal/cursor/account-mcp.ts +153 -41
- package/src/internal/cursor-event-relay.ts +5 -0
- package/src/internal/discovery.ts +70 -8
- package/src/internal/distribution.ts +1 -0
- package/src/internal/logs-client.ts +1 -1
- package/src/internal/mcp-host.ts +33 -9
- package/src/internal/mcp-oauth.ts +496 -0
- package/src/internal/resolved-connections.ts +6 -1
- package/src/internal/sdk-runner.ts +37 -1
- package/src/internal/server.ts +13 -5
- package/src/internal/session-engine.ts +115 -74
- package/src/internal/sessions-client.ts +2 -1
- package/src/internal/stream-progress.ts +8 -0
- package/src/internal/turn-governor.ts +145 -0
- package/src/prompt.ts +83 -0
- package/src/types.ts +76 -6
- package/dist/channels/slack/post-update-delivery.d.ts +0 -85
- package/dist/channels/slack/post-update-delivery.d.ts.map +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.OfDZ5CXg.js +0 -1
- package/dist/internal/persistence-coordinator.d.ts +0 -127
- package/dist/internal/persistence-coordinator.d.ts.map +0 -1
- package/dist/persistence.d.ts +0 -184
- package/dist/persistence.d.ts.map +0 -1
- package/dist/playground/assets/index-C0-QEG4O.js +0 -86
- package/dist/playground/assets/index-z3JY9O2x.css +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small filesystem helpers for one-JSON-file-per-id persistence under a
|
|
3
|
+
* project-relative directory (eval run snapshots, A/B aggregate snapshots).
|
|
4
|
+
*/
|
|
5
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
6
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
7
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
8
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
9
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
10
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
11
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
import { randomBytes } from "node:crypto";
|
|
15
|
+
import { mkdir, readdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
|
|
16
|
+
import { isAbsolute, join } from "node:path";
|
|
17
|
+
export function assertNonEmptyDir(dir, fnName) {
|
|
18
|
+
if (typeof dir !== "string" || dir.trim() === "") {
|
|
19
|
+
throw new Error(`${fnName}: dir must be a non-empty string`);
|
|
20
|
+
}
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
/** Resolve `dir` against `projectRoot` when relative. */
|
|
24
|
+
export function resolveProjectRelativeDir(args) {
|
|
25
|
+
return isAbsolute(args.dir) ? args.dir : join(args.projectRoot, args.dir);
|
|
26
|
+
}
|
|
27
|
+
function isEnoent(error) {
|
|
28
|
+
return (error !== null &&
|
|
29
|
+
typeof error === "object" &&
|
|
30
|
+
"code" in error &&
|
|
31
|
+
error.code === "ENOENT");
|
|
32
|
+
}
|
|
33
|
+
/** List `*.json` basenames in `root` (any order). Missing dir → []. */
|
|
34
|
+
export function listJsonBasenames(root) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
let names;
|
|
37
|
+
try {
|
|
38
|
+
names = yield readdir(root);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (isEnoent(error)) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
return names.filter((name) => name.endsWith(".json"));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Read and JSON.parse every `*.json` file under `root`. Missing dir → [].
|
|
51
|
+
* Unreadable or corrupt files are skipped so one bad snapshot cannot wipe
|
|
52
|
+
* the rest of the history.
|
|
53
|
+
*/
|
|
54
|
+
export function readJsonDir(root, options) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
let names = yield listJsonBasenames(root);
|
|
57
|
+
if ((options === null || options === void 0 ? void 0 : options.sortBasenames) === "asc") {
|
|
58
|
+
names = [...names].sort();
|
|
59
|
+
}
|
|
60
|
+
else if ((options === null || options === void 0 ? void 0 : options.sortBasenames) === "desc") {
|
|
61
|
+
names = [...names].sort().reverse();
|
|
62
|
+
}
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const name of names) {
|
|
65
|
+
try {
|
|
66
|
+
const raw = yield readFile(join(root, name), "utf8");
|
|
67
|
+
out.push(JSON.parse(raw));
|
|
68
|
+
}
|
|
69
|
+
catch (_a) {
|
|
70
|
+
// skip corrupt / unreadable files
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Atomically write JSON under `root`/`fileName` (temp file + rename). */
|
|
77
|
+
export function writeJsonFile(args) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
const { root, fileName, value } = args;
|
|
80
|
+
// Serialize before any await so callers get a stable snapshot even if they
|
|
81
|
+
// mutate `value` afterward.
|
|
82
|
+
const body = `${JSON.stringify(value, null, 2)}\n`;
|
|
83
|
+
yield mkdir(root, { recursive: true });
|
|
84
|
+
const finalPath = join(root, fileName);
|
|
85
|
+
const tmpPath = `${finalPath}.${randomBytes(4).toString("hex")}.tmp`;
|
|
86
|
+
yield writeFile(tmpPath, body, "utf8");
|
|
87
|
+
yield rename(tmpPath, finalPath);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Best-effort delete; ignores missing files. */
|
|
91
|
+
export function deleteFileInDir(args) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
try {
|
|
94
|
+
yield rm(join(args.root, args.fileName), { force: true });
|
|
95
|
+
}
|
|
96
|
+
catch (_a) {
|
|
97
|
+
// ignore
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
@@ -25,7 +25,7 @@ const PROGRESS_MESSAGES = {
|
|
|
25
25
|
queued: "Waiting to start…",
|
|
26
26
|
preparing: "Preparing runtime…",
|
|
27
27
|
creating: "Creating runtime…",
|
|
28
|
-
building: "Checking out source
|
|
28
|
+
building: "Checking out source…",
|
|
29
29
|
starting: "Starting agent and waiting for health…",
|
|
30
30
|
finalizing: "Finishing deployment…",
|
|
31
31
|
running: "Deployment running",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEhB,MAAM,aAAa,CAAC;AASrB,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAYlE;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAO5B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED,OAAO,CAAC,SAAS;YAYH,OAAO;CAUtB"}
|
|
@@ -17,10 +17,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
17
17
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
18
18
|
});
|
|
19
19
|
};
|
|
20
|
+
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
20
21
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
21
22
|
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
22
23
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
23
24
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
25
|
+
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
26
|
+
import { createHostMcpOAuthProvider } from "./mcp-oauth.js";
|
|
24
27
|
export class McpHost {
|
|
25
28
|
constructor(connections) {
|
|
26
29
|
this.byName = new Map();
|
|
@@ -99,8 +102,17 @@ function openConnection(connection) {
|
|
|
99
102
|
name: "agent-serve",
|
|
100
103
|
version: "0.1.0",
|
|
101
104
|
});
|
|
102
|
-
const transport = createTransport(connection);
|
|
103
|
-
|
|
105
|
+
const transport = yield createTransport(connection);
|
|
106
|
+
try {
|
|
107
|
+
yield client.connect(transport);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error instanceof UnauthorizedError &&
|
|
111
|
+
isOauthHttpTransport(connection.transport)) {
|
|
112
|
+
throw new Error(`MCP connection "${connection.name}" needs authorization. Run \`${CLI} mcp oauth ${connection.name}\`.`, { cause: error });
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
104
116
|
return {
|
|
105
117
|
client,
|
|
106
118
|
close: () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -122,30 +134,41 @@ function openConnection(connection) {
|
|
|
122
134
|
});
|
|
123
135
|
}
|
|
124
136
|
function createTransport(connection) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
137
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
138
|
+
var _a;
|
|
139
|
+
const transport = connection.transport;
|
|
140
|
+
if ("agent" in transport) {
|
|
141
|
+
// Peers are resolved to concrete URLs by the serve host before any call
|
|
142
|
+
// (SessionEngine.setResolvedConnections); reaching here means the
|
|
143
|
+
// connection is being used outside a running server.
|
|
144
|
+
throw new Error(`MCP connection "${connection.name}" targets peer agent "${transport.agent}" and has not been resolved; peer MCP connections are only callable on a running serve host.`);
|
|
145
|
+
}
|
|
146
|
+
if ("cursorAccount" in transport) {
|
|
147
|
+
// Same contract as peers: the serve host resolves the account bridge URL
|
|
148
|
+
// before any call (SessionEngine.setResolvedConnections).
|
|
149
|
+
throw new Error(`MCP connection "${connection.name}" exposes the Cursor account's connectors and has not been resolved; Cursor account MCP connections are only callable on a running serve host.`);
|
|
150
|
+
}
|
|
151
|
+
if ("command" in transport) {
|
|
152
|
+
return new StdioClientTransport(Object.assign(Object.assign(Object.assign({ command: transport.command }, (transport.args === undefined ? {} : { args: transport.args })), { env: Object.assign(Object.assign({}, Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined))), ((_a = transport.env) !== null && _a !== void 0 ? _a : {})) }), (transport.cwd === undefined ? {} : { cwd: transport.cwd })));
|
|
153
|
+
}
|
|
154
|
+
const url = new URL(transport.url);
|
|
155
|
+
const requestInit = transport.headers === undefined
|
|
156
|
+
? undefined
|
|
157
|
+
: { headers: transport.headers };
|
|
158
|
+
const authProvider = transport.oauth === true
|
|
159
|
+
? yield createHostMcpOAuthProvider({
|
|
160
|
+
identifier: connection.name,
|
|
161
|
+
resourceUrl: transport.url,
|
|
162
|
+
})
|
|
163
|
+
: undefined;
|
|
164
|
+
if (transport.type === "sse") {
|
|
165
|
+
return new SSEClientTransport(url, { requestInit, authProvider });
|
|
166
|
+
}
|
|
167
|
+
return new StreamableHTTPClientTransport(url, { requestInit, authProvider });
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function isOauthHttpTransport(transport) {
|
|
171
|
+
return "url" in transport && transport.oauth === true;
|
|
149
172
|
}
|
|
150
173
|
function normalizeCallResult(result) {
|
|
151
174
|
if (typeof result !== "object" || result === null) {
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side MCP OAuth for `defineConnection({ url, oauth: true })`.
|
|
3
|
+
* Local: mcp-auth.json. Prod secrets: `mcp oauth <name> --store`.
|
|
4
|
+
*/
|
|
5
|
+
import type { OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
6
|
+
import type { OAuthClientInformationFull, OAuthClientMetadata, OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js";
|
|
7
|
+
export declare const MCP_OAUTH_CALLBACK_PORT = 8787;
|
|
8
|
+
export declare const MCP_OAUTH_CALLBACK_PATH = "/callback";
|
|
9
|
+
export declare const MCP_OAUTH_CALLBACK_URL: string;
|
|
10
|
+
/** `anytool` → `MCP_OAUTH_ANYTOOL`. */
|
|
11
|
+
export declare function mcpOauthEnvPrefix(connection: string): string;
|
|
12
|
+
export type McpOauthSecretNames = {
|
|
13
|
+
accessToken: string;
|
|
14
|
+
refreshToken: string;
|
|
15
|
+
clientId: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function mcpOauthSecretNames(connection: string): McpOauthSecretNames;
|
|
18
|
+
export declare function tokensFromEnv(connection: string, env?: NodeJS.ProcessEnv): OAuthTokens | undefined;
|
|
19
|
+
export declare function clientIdFromEnv(connection: string, env?: NodeJS.ProcessEnv): OAuthClientInformationFull | undefined;
|
|
20
|
+
/** Sibling of `credentials.json` under `~/.config/agent-serve/`. */
|
|
21
|
+
export declare function defaultMcpAuthPath(): string;
|
|
22
|
+
/** Canonical MCP resource key for binding stored tokens to a server URL. */
|
|
23
|
+
export declare function normalizeMcpResourceUrl(url: string): string;
|
|
24
|
+
export declare class FileMcpOAuthStore {
|
|
25
|
+
readonly path: string;
|
|
26
|
+
private cache;
|
|
27
|
+
private loading;
|
|
28
|
+
constructor(path?: string);
|
|
29
|
+
loadTokens(id: string, resourceUrl: string): Promise<OAuthTokens | undefined>;
|
|
30
|
+
loadClientInformation(id: string, resourceUrl: string): Promise<OAuthClientInformationFull | undefined>;
|
|
31
|
+
saveTokens(id: string, resourceUrl: string, tokens: OAuthTokens): Promise<void>;
|
|
32
|
+
saveClientInformation(id: string, resourceUrl: string, clientInfo: OAuthClientInformationFull): Promise<void>;
|
|
33
|
+
deleteCredentials(id: string): Promise<void>;
|
|
34
|
+
private entryFor;
|
|
35
|
+
private update;
|
|
36
|
+
private read;
|
|
37
|
+
private readDisk;
|
|
38
|
+
private write;
|
|
39
|
+
private withLock;
|
|
40
|
+
}
|
|
41
|
+
type ProviderArgs = {
|
|
42
|
+
identifier: string;
|
|
43
|
+
resourceUrl: string;
|
|
44
|
+
store: FileMcpOAuthStore;
|
|
45
|
+
redirectUrl?: string;
|
|
46
|
+
onRedirect?: (url: URL) => void;
|
|
47
|
+
tokens?: OAuthTokens;
|
|
48
|
+
clientInformation?: OAuthClientInformationFull;
|
|
49
|
+
};
|
|
50
|
+
export declare class HostMcpOAuthProvider implements OAuthClientProvider {
|
|
51
|
+
private tokensValue;
|
|
52
|
+
private clientInfo;
|
|
53
|
+
private verifier;
|
|
54
|
+
private redirect;
|
|
55
|
+
private readonly meta;
|
|
56
|
+
private readonly args;
|
|
57
|
+
constructor(args: ProviderArgs);
|
|
58
|
+
get redirectUrl(): string;
|
|
59
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
60
|
+
get lastRedirectUrl(): URL | undefined;
|
|
61
|
+
state(): string;
|
|
62
|
+
clientInformation(): OAuthClientInformationFull | undefined;
|
|
63
|
+
saveClientInformation(info: OAuthClientInformationFull): Promise<void>;
|
|
64
|
+
tokens(): OAuthTokens | undefined;
|
|
65
|
+
saveTokens(tokens: OAuthTokens): Promise<void>;
|
|
66
|
+
redirectToAuthorization(url: URL): void;
|
|
67
|
+
saveCodeVerifier(codeVerifier: string): Promise<void>;
|
|
68
|
+
codeVerifier(): string;
|
|
69
|
+
invalidateCredentials(scope: "all" | "client" | "tokens" | "verifier"): Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
export declare function createHostMcpOAuthProvider(args: {
|
|
72
|
+
identifier: string;
|
|
73
|
+
resourceUrl: string;
|
|
74
|
+
store?: FileMcpOAuthStore;
|
|
75
|
+
onRedirect?: (url: URL) => void;
|
|
76
|
+
}): Promise<HostMcpOAuthProvider>;
|
|
77
|
+
export type OAuthCallbackResult = {
|
|
78
|
+
code: string;
|
|
79
|
+
state?: string;
|
|
80
|
+
};
|
|
81
|
+
export declare function waitForMcpOAuthCallback(args?: {
|
|
82
|
+
port?: number;
|
|
83
|
+
path?: string;
|
|
84
|
+
timeoutMs?: number;
|
|
85
|
+
}): Promise<OAuthCallbackResult>;
|
|
86
|
+
export declare function openBrowser(url: string): void;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=mcp-oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-oauth.ts"],"names":[],"mappings":"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"}
|