@tokamohsen/sentry-mcp 0.29.7 → 0.29.10

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 (77) hide show
  1. package/README.md +189 -0
  2. package/dist/index.cjs +33696 -34
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.js +33706 -45
  5. package/dist/index.js.map +1 -1
  6. package/dist/{token-GX19_oyM.cjs → token-B5HKFZKz.cjs} +2 -2
  7. package/dist/{token-GX19_oyM.cjs.map → token-B5HKFZKz.cjs.map} +1 -1
  8. package/dist/{token-CO5Bq1Ct.js → token-JvPeoopD.js} +2 -2
  9. package/dist/{token-CO5Bq1Ct.js.map → token-JvPeoopD.js.map} +1 -1
  10. package/dist/{token-util-Cw83HNFN.cjs → token-util-BNYjqouU.cjs} +1 -1
  11. package/dist/{token-util-Cw83HNFN.cjs.map → token-util-BNYjqouU.cjs.map} +1 -1
  12. package/dist/{token-util-1O_mwf8r.js → token-util-CqB8j8br.js} +2 -2
  13. package/dist/{token-util-1O_mwf8r.js.map → token-util-CqB8j8br.js.map} +1 -1
  14. package/dist/transports/{stdio-DeWUp4RP.d.cts → stdio-BoqvAN3P.d.cts} +1 -1
  15. package/dist/transports/{stdio-DeWUp4RP.d.cts.map → stdio-BoqvAN3P.d.cts.map} +1 -1
  16. package/dist/transports/{stdio-DKQR8J7l.d.ts → stdio-BvNog4wx.d.ts} +1 -1
  17. package/dist/transports/{stdio-DKQR8J7l.d.ts.map → stdio-BvNog4wx.d.ts.map} +1 -1
  18. package/dist/transports/stdio.cjs +1 -1
  19. package/dist/transports/stdio.js +1 -1
  20. package/dist/{version-BD4r13ze.cjs → version-BN5g2FHt.cjs} +1 -1
  21. package/dist/{version-BD4r13ze.cjs.map → version-BN5g2FHt.cjs.map} +1 -1
  22. package/dist/{version-4iOZzjiD.js → version-CV6JJx_P.js} +1 -1
  23. package/dist/{version-4iOZzjiD.js.map → version-CV6JJx_P.js.map} +1 -1
  24. package/package.json +19 -18
  25. package/LICENSE.md +0 -105
  26. package/dist/cli/parse-CX7Bcldr.d.ts +0 -11
  27. package/dist/cli/parse-CX7Bcldr.d.ts.map +0 -1
  28. package/dist/cli/parse-EvLqDjN2.d.cts +0 -11
  29. package/dist/cli/parse-EvLqDjN2.d.cts.map +0 -1
  30. package/dist/cli/parse.cjs +0 -107
  31. package/dist/cli/parse.cjs.map +0 -1
  32. package/dist/cli/parse.js +0 -103
  33. package/dist/cli/parse.js.map +0 -1
  34. package/dist/cli/resolve-BVtyZcQM.d.ts +0 -10
  35. package/dist/cli/resolve-BVtyZcQM.d.ts.map +0 -1
  36. package/dist/cli/resolve-C3hwH129.d.cts +0 -10
  37. package/dist/cli/resolve-C3hwH129.d.cts.map +0 -1
  38. package/dist/cli/resolve.cjs +0 -56
  39. package/dist/cli/resolve.cjs.map +0 -1
  40. package/dist/cli/resolve.js +0 -54
  41. package/dist/cli/resolve.js.map +0 -1
  42. package/dist/cli/types-CnTkIHzd.d.ts +0 -73
  43. package/dist/cli/types-CnTkIHzd.d.ts.map +0 -1
  44. package/dist/cli/types-VWgo1wm6.d.cts +0 -73
  45. package/dist/cli/types-VWgo1wm6.d.cts.map +0 -1
  46. package/dist/cli/types.cjs +0 -0
  47. package/dist/cli/types.js +0 -1
  48. package/dist/cli/usage-B0gAPy4S.d.cts +0 -9
  49. package/dist/cli/usage-B0gAPy4S.d.cts.map +0 -1
  50. package/dist/cli/usage-BhCVaC5j.d.ts +0 -9
  51. package/dist/cli/usage-BhCVaC5j.d.ts.map +0 -1
  52. package/dist/cli/usage.cjs +0 -47
  53. package/dist/cli/usage.cjs.map +0 -1
  54. package/dist/cli/usage.js +0 -45
  55. package/dist/cli/usage.js.map +0 -1
  56. package/dist/config-CzqCJmB9.js +0 -613
  57. package/dist/config-CzqCJmB9.js.map +0 -1
  58. package/dist/config-DMt6phB6.cjs +0 -630
  59. package/dist/config-DMt6phB6.cjs.map +0 -1
  60. package/dist/constants-BrEVt86y.js +0 -194
  61. package/dist/constants-BrEVt86y.js.map +0 -1
  62. package/dist/constants-C14tQf_s.cjs +0 -217
  63. package/dist/constants-C14tQf_s.cjs.map +0 -1
  64. package/dist/server-DduxvXpe.js +0 -32499
  65. package/dist/server-DduxvXpe.js.map +0 -1
  66. package/dist/server-lur5iSHk.cjs +0 -32530
  67. package/dist/server-lur5iSHk.cjs.map +0 -1
  68. package/dist/skills-DOgs9MAy.cjs +0 -96
  69. package/dist/skills-DOgs9MAy.cjs.map +0 -1
  70. package/dist/skills-DfqlqYXj.js +0 -72
  71. package/dist/skills-DfqlqYXj.js.map +0 -1
  72. package/dist/url-utils-BHhxlntO.js +0 -119
  73. package/dist/url-utils-BHhxlntO.js.map +0 -1
  74. package/dist/url-utils-N2ExJl9F.cjs +0 -161
  75. package/dist/url-utils-N2ExJl9F.cjs.map +0 -1
  76. /package/dist/{index-16fTC-hT.d.cts → index-Cxeq9ZuA.d.ts} +0 -0
  77. /package/dist/{index-UKPmYT-S.d.ts → index-XTv1ki6h.d.cts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse-EvLqDjN2.d.cts","names":[],"sources":["../../src/cli/parse.ts"],"sourcesContent":[],"mappings":";;;iBAGgB,SAAA,kBAA2B;iBAuE3B,QAAA,MAAc,MAAA,CAAO,aAAa;AAvElC,iBAwFA,KAAA,CAxF2B,GAAA,EAwFhB,OAxFuB,EAAA,GAAA,EAwFT,OAxFS,CAAA,EAwFC,UAxFD;AAuElD"}
@@ -1,107 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-rXqPaSPc.cjs');
3
- let node_util = require("node:util");
4
-
5
- //#region src/cli/parse.ts
6
- function parseArgv(argv) {
7
- const options = {
8
- "access-token": { type: "string" },
9
- host: { type: "string" },
10
- url: { type: "string" },
11
- "mcp-url": { type: "string" },
12
- "sentry-dsn": { type: "string" },
13
- "openai-base-url": { type: "string" },
14
- "openai-model": { type: "string" },
15
- "anthropic-base-url": { type: "string" },
16
- "anthropic-model": { type: "string" },
17
- "agent-provider": { type: "string" },
18
- "organization-slug": { type: "string" },
19
- "project-slug": { type: "string" },
20
- skills: { type: "string" },
21
- agent: { type: "boolean" },
22
- experimental: { type: "boolean" },
23
- help: {
24
- type: "boolean",
25
- short: "h"
26
- },
27
- version: {
28
- type: "boolean",
29
- short: "v"
30
- }
31
- };
32
- const { values, positionals, tokens } = (0, node_util.parseArgs)({
33
- args: argv,
34
- options,
35
- allowPositionals: false,
36
- strict: false,
37
- tokens: true
38
- });
39
- const knownLong = new Set(Object.keys(options));
40
- const knownShort = new Set([...Object.values(options).map((o) => "short" in o ? o.short : void 0).filter(Boolean)]);
41
- const unknownArgs = [];
42
- for (const t of tokens || []) if (t.kind === "option") {
43
- const name = t.name;
44
- if (name && !(knownLong.has(name) || knownShort.has(name))) unknownArgs.push(t.raw ?? `--${name}`);
45
- } else if (t.kind === "positional") unknownArgs.push(t.raw ?? String(t.value ?? ""));
46
- return {
47
- accessToken: values["access-token"],
48
- host: values.host,
49
- url: values.url,
50
- mcpUrl: values["mcp-url"],
51
- sentryDsn: values["sentry-dsn"],
52
- openaiBaseUrl: values["openai-base-url"],
53
- openaiModel: values["openai-model"],
54
- anthropicBaseUrl: values["anthropic-base-url"],
55
- anthropicModel: values["anthropic-model"],
56
- agentProvider: values["agent-provider"],
57
- organizationSlug: values["organization-slug"],
58
- projectSlug: values["project-slug"],
59
- skills: values.skills,
60
- agent: values.agent === true,
61
- experimental: values.experimental === true,
62
- help: values.help === true,
63
- version: values.version === true,
64
- unknownArgs: unknownArgs.length > 0 ? unknownArgs : positionals || []
65
- };
66
- }
67
- function parseEnv(env) {
68
- const fromEnv = {};
69
- if (env.SENTRY_ACCESS_TOKEN) fromEnv.accessToken = env.SENTRY_ACCESS_TOKEN;
70
- if (env.SENTRY_URL) fromEnv.url = env.SENTRY_URL;
71
- if (env.SENTRY_HOST) fromEnv.host = env.SENTRY_HOST;
72
- if (env.MCP_URL) fromEnv.mcpUrl = env.MCP_URL;
73
- if (env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN) fromEnv.sentryDsn = env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN;
74
- if (env.OPENAI_MODEL) fromEnv.openaiModel = env.OPENAI_MODEL;
75
- if (env.ANTHROPIC_MODEL) fromEnv.anthropicModel = env.ANTHROPIC_MODEL;
76
- if (env.EMBEDDED_AGENT_PROVIDER) fromEnv.agentProvider = env.EMBEDDED_AGENT_PROVIDER;
77
- if (env.MCP_SKILLS) fromEnv.skills = env.MCP_SKILLS;
78
- return fromEnv;
79
- }
80
- function merge(cli, env) {
81
- return {
82
- accessToken: cli.accessToken ?? env.accessToken,
83
- url: cli.url ?? env.url,
84
- host: cli.host ?? env.host,
85
- mcpUrl: cli.mcpUrl ?? env.mcpUrl,
86
- sentryDsn: cli.sentryDsn ?? env.sentryDsn,
87
- openaiBaseUrl: cli.openaiBaseUrl,
88
- openaiModel: cli.openaiModel ?? env.openaiModel,
89
- anthropicBaseUrl: cli.anthropicBaseUrl,
90
- anthropicModel: cli.anthropicModel ?? env.anthropicModel,
91
- agentProvider: cli.agentProvider ?? env.agentProvider,
92
- skills: cli.skills ?? env.skills,
93
- agent: cli.agent === true,
94
- experimental: cli.experimental === true,
95
- organizationSlug: cli.organizationSlug,
96
- projectSlug: cli.projectSlug,
97
- help: cli.help === true,
98
- version: cli.version === true,
99
- unknownArgs: cli.unknownArgs
100
- };
101
- }
102
-
103
- //#endregion
104
- exports.merge = merge;
105
- exports.parseArgv = parseArgv;
106
- exports.parseEnv = parseEnv;
107
- //# sourceMappingURL=parse.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse.cjs","names":[],"sources":["../../src/cli/parse.ts"],"sourcesContent":["import { parseArgs } from \"node:util\";\nimport type { CliArgs, EnvArgs, MergedArgs } from \"./types\";\n\nexport function parseArgv(argv: string[]): CliArgs {\n const options = {\n \"access-token\": { type: \"string\" as const },\n host: { type: \"string\" as const },\n url: { type: \"string\" as const },\n \"mcp-url\": { type: \"string\" as const },\n \"sentry-dsn\": { type: \"string\" as const },\n \"openai-base-url\": { type: \"string\" as const },\n \"openai-model\": { type: \"string\" as const },\n \"anthropic-base-url\": { type: \"string\" as const },\n \"anthropic-model\": { type: \"string\" as const },\n \"agent-provider\": { type: \"string\" as const },\n \"organization-slug\": { type: \"string\" as const },\n \"project-slug\": { type: \"string\" as const },\n skills: { type: \"string\" as const },\n agent: { type: \"boolean\" as const },\n experimental: { type: \"boolean\" as const },\n help: { type: \"boolean\" as const, short: \"h\" as const },\n version: { type: \"boolean\" as const, short: \"v\" as const },\n };\n\n const { values, positionals, tokens } = parseArgs({\n args: argv,\n options,\n allowPositionals: false,\n strict: false,\n tokens: true,\n });\n\n const knownLong = new Set(Object.keys(options));\n const knownShort = new Set([\n ...(Object.values(options)\n .map((o) => (\"short\" in o ? (o.short as string | undefined) : undefined))\n .filter(Boolean) as string[]),\n ]);\n\n const unknownArgs: string[] = [];\n for (const t of (tokens as any[]) || []) {\n if (t.kind === \"option\") {\n const name = t.name as string | undefined;\n if (name && !(knownLong.has(name) || knownShort.has(name))) {\n unknownArgs.push((t.raw as string) ?? `--${name}`);\n }\n } else if (t.kind === \"positional\") {\n unknownArgs.push((t.raw as string) ?? String(t.value ?? \"\"));\n }\n }\n\n return {\n accessToken: values[\"access-token\"] as string | undefined,\n host: values.host as string | undefined,\n url: values.url as string | undefined,\n mcpUrl: values[\"mcp-url\"] as string | undefined,\n sentryDsn: values[\"sentry-dsn\"] as string | undefined,\n openaiBaseUrl: values[\"openai-base-url\"] as string | undefined,\n openaiModel: values[\"openai-model\"] as string | undefined,\n anthropicBaseUrl: values[\"anthropic-base-url\"] as string | undefined,\n anthropicModel: values[\"anthropic-model\"] as string | undefined,\n agentProvider: values[\"agent-provider\"] as string | undefined,\n organizationSlug: values[\"organization-slug\"] as string | undefined,\n projectSlug: values[\"project-slug\"] as string | undefined,\n skills: values.skills as string | undefined,\n agent: values.agent === true,\n experimental: values.experimental === true,\n help: (values.help as boolean | undefined) === true,\n version: (values.version as boolean | undefined) === true,\n unknownArgs:\n unknownArgs.length > 0 ? unknownArgs : (positionals as string[]) || [],\n };\n}\n\nexport function parseEnv(env: NodeJS.ProcessEnv): EnvArgs {\n const fromEnv: EnvArgs = {};\n if (env.SENTRY_ACCESS_TOKEN) fromEnv.accessToken = env.SENTRY_ACCESS_TOKEN;\n if (env.SENTRY_URL) fromEnv.url = env.SENTRY_URL;\n if (env.SENTRY_HOST) fromEnv.host = env.SENTRY_HOST;\n if (env.MCP_URL) fromEnv.mcpUrl = env.MCP_URL;\n if (env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN)\n fromEnv.sentryDsn = env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN;\n\n if (env.OPENAI_MODEL) fromEnv.openaiModel = env.OPENAI_MODEL;\n if (env.ANTHROPIC_MODEL) fromEnv.anthropicModel = env.ANTHROPIC_MODEL;\n if (env.EMBEDDED_AGENT_PROVIDER)\n fromEnv.agentProvider = env.EMBEDDED_AGENT_PROVIDER;\n if (env.MCP_SKILLS) fromEnv.skills = env.MCP_SKILLS;\n return fromEnv;\n}\n\nexport function merge(cli: CliArgs, env: EnvArgs): MergedArgs {\n // CLI wins over env\n return {\n accessToken: cli.accessToken ?? env.accessToken,\n // If CLI provided url/host, prefer those; else fall back to env\n url: cli.url ?? env.url,\n host: cli.host ?? env.host,\n mcpUrl: cli.mcpUrl ?? env.mcpUrl,\n sentryDsn: cli.sentryDsn ?? env.sentryDsn,\n openaiBaseUrl: cli.openaiBaseUrl,\n openaiModel: cli.openaiModel ?? env.openaiModel,\n anthropicBaseUrl: cli.anthropicBaseUrl,\n anthropicModel: cli.anthropicModel ?? env.anthropicModel,\n agentProvider: cli.agentProvider ?? env.agentProvider,\n // Skills precedence: CLI skills override env\n skills: cli.skills ?? env.skills,\n agent: cli.agent === true,\n experimental: cli.experimental === true,\n organizationSlug: cli.organizationSlug,\n projectSlug: cli.projectSlug,\n help: cli.help === true,\n version: cli.version === true,\n unknownArgs: cli.unknownArgs,\n };\n}\n"],"mappings":"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"}
package/dist/cli/parse.js DELETED
@@ -1,103 +0,0 @@
1
- import { parseArgs } from "node:util";
2
-
3
- //#region src/cli/parse.ts
4
- function parseArgv(argv) {
5
- const options = {
6
- "access-token": { type: "string" },
7
- host: { type: "string" },
8
- url: { type: "string" },
9
- "mcp-url": { type: "string" },
10
- "sentry-dsn": { type: "string" },
11
- "openai-base-url": { type: "string" },
12
- "openai-model": { type: "string" },
13
- "anthropic-base-url": { type: "string" },
14
- "anthropic-model": { type: "string" },
15
- "agent-provider": { type: "string" },
16
- "organization-slug": { type: "string" },
17
- "project-slug": { type: "string" },
18
- skills: { type: "string" },
19
- agent: { type: "boolean" },
20
- experimental: { type: "boolean" },
21
- help: {
22
- type: "boolean",
23
- short: "h"
24
- },
25
- version: {
26
- type: "boolean",
27
- short: "v"
28
- }
29
- };
30
- const { values, positionals, tokens } = parseArgs({
31
- args: argv,
32
- options,
33
- allowPositionals: false,
34
- strict: false,
35
- tokens: true
36
- });
37
- const knownLong = new Set(Object.keys(options));
38
- const knownShort = new Set([...Object.values(options).map((o) => "short" in o ? o.short : void 0).filter(Boolean)]);
39
- const unknownArgs = [];
40
- for (const t of tokens || []) if (t.kind === "option") {
41
- const name = t.name;
42
- if (name && !(knownLong.has(name) || knownShort.has(name))) unknownArgs.push(t.raw ?? `--${name}`);
43
- } else if (t.kind === "positional") unknownArgs.push(t.raw ?? String(t.value ?? ""));
44
- return {
45
- accessToken: values["access-token"],
46
- host: values.host,
47
- url: values.url,
48
- mcpUrl: values["mcp-url"],
49
- sentryDsn: values["sentry-dsn"],
50
- openaiBaseUrl: values["openai-base-url"],
51
- openaiModel: values["openai-model"],
52
- anthropicBaseUrl: values["anthropic-base-url"],
53
- anthropicModel: values["anthropic-model"],
54
- agentProvider: values["agent-provider"],
55
- organizationSlug: values["organization-slug"],
56
- projectSlug: values["project-slug"],
57
- skills: values.skills,
58
- agent: values.agent === true,
59
- experimental: values.experimental === true,
60
- help: values.help === true,
61
- version: values.version === true,
62
- unknownArgs: unknownArgs.length > 0 ? unknownArgs : positionals || []
63
- };
64
- }
65
- function parseEnv(env) {
66
- const fromEnv = {};
67
- if (env.SENTRY_ACCESS_TOKEN) fromEnv.accessToken = env.SENTRY_ACCESS_TOKEN;
68
- if (env.SENTRY_URL) fromEnv.url = env.SENTRY_URL;
69
- if (env.SENTRY_HOST) fromEnv.host = env.SENTRY_HOST;
70
- if (env.MCP_URL) fromEnv.mcpUrl = env.MCP_URL;
71
- if (env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN) fromEnv.sentryDsn = env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN;
72
- if (env.OPENAI_MODEL) fromEnv.openaiModel = env.OPENAI_MODEL;
73
- if (env.ANTHROPIC_MODEL) fromEnv.anthropicModel = env.ANTHROPIC_MODEL;
74
- if (env.EMBEDDED_AGENT_PROVIDER) fromEnv.agentProvider = env.EMBEDDED_AGENT_PROVIDER;
75
- if (env.MCP_SKILLS) fromEnv.skills = env.MCP_SKILLS;
76
- return fromEnv;
77
- }
78
- function merge(cli, env) {
79
- return {
80
- accessToken: cli.accessToken ?? env.accessToken,
81
- url: cli.url ?? env.url,
82
- host: cli.host ?? env.host,
83
- mcpUrl: cli.mcpUrl ?? env.mcpUrl,
84
- sentryDsn: cli.sentryDsn ?? env.sentryDsn,
85
- openaiBaseUrl: cli.openaiBaseUrl,
86
- openaiModel: cli.openaiModel ?? env.openaiModel,
87
- anthropicBaseUrl: cli.anthropicBaseUrl,
88
- anthropicModel: cli.anthropicModel ?? env.anthropicModel,
89
- agentProvider: cli.agentProvider ?? env.agentProvider,
90
- skills: cli.skills ?? env.skills,
91
- agent: cli.agent === true,
92
- experimental: cli.experimental === true,
93
- organizationSlug: cli.organizationSlug,
94
- projectSlug: cli.projectSlug,
95
- help: cli.help === true,
96
- version: cli.version === true,
97
- unknownArgs: cli.unknownArgs
98
- };
99
- }
100
-
101
- //#endregion
102
- export { merge, parseArgv, parseEnv };
103
- //# sourceMappingURL=parse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse.js","names":[],"sources":["../../src/cli/parse.ts"],"sourcesContent":["import { parseArgs } from \"node:util\";\nimport type { CliArgs, EnvArgs, MergedArgs } from \"./types\";\n\nexport function parseArgv(argv: string[]): CliArgs {\n const options = {\n \"access-token\": { type: \"string\" as const },\n host: { type: \"string\" as const },\n url: { type: \"string\" as const },\n \"mcp-url\": { type: \"string\" as const },\n \"sentry-dsn\": { type: \"string\" as const },\n \"openai-base-url\": { type: \"string\" as const },\n \"openai-model\": { type: \"string\" as const },\n \"anthropic-base-url\": { type: \"string\" as const },\n \"anthropic-model\": { type: \"string\" as const },\n \"agent-provider\": { type: \"string\" as const },\n \"organization-slug\": { type: \"string\" as const },\n \"project-slug\": { type: \"string\" as const },\n skills: { type: \"string\" as const },\n agent: { type: \"boolean\" as const },\n experimental: { type: \"boolean\" as const },\n help: { type: \"boolean\" as const, short: \"h\" as const },\n version: { type: \"boolean\" as const, short: \"v\" as const },\n };\n\n const { values, positionals, tokens } = parseArgs({\n args: argv,\n options,\n allowPositionals: false,\n strict: false,\n tokens: true,\n });\n\n const knownLong = new Set(Object.keys(options));\n const knownShort = new Set([\n ...(Object.values(options)\n .map((o) => (\"short\" in o ? (o.short as string | undefined) : undefined))\n .filter(Boolean) as string[]),\n ]);\n\n const unknownArgs: string[] = [];\n for (const t of (tokens as any[]) || []) {\n if (t.kind === \"option\") {\n const name = t.name as string | undefined;\n if (name && !(knownLong.has(name) || knownShort.has(name))) {\n unknownArgs.push((t.raw as string) ?? `--${name}`);\n }\n } else if (t.kind === \"positional\") {\n unknownArgs.push((t.raw as string) ?? String(t.value ?? \"\"));\n }\n }\n\n return {\n accessToken: values[\"access-token\"] as string | undefined,\n host: values.host as string | undefined,\n url: values.url as string | undefined,\n mcpUrl: values[\"mcp-url\"] as string | undefined,\n sentryDsn: values[\"sentry-dsn\"] as string | undefined,\n openaiBaseUrl: values[\"openai-base-url\"] as string | undefined,\n openaiModel: values[\"openai-model\"] as string | undefined,\n anthropicBaseUrl: values[\"anthropic-base-url\"] as string | undefined,\n anthropicModel: values[\"anthropic-model\"] as string | undefined,\n agentProvider: values[\"agent-provider\"] as string | undefined,\n organizationSlug: values[\"organization-slug\"] as string | undefined,\n projectSlug: values[\"project-slug\"] as string | undefined,\n skills: values.skills as string | undefined,\n agent: values.agent === true,\n experimental: values.experimental === true,\n help: (values.help as boolean | undefined) === true,\n version: (values.version as boolean | undefined) === true,\n unknownArgs:\n unknownArgs.length > 0 ? unknownArgs : (positionals as string[]) || [],\n };\n}\n\nexport function parseEnv(env: NodeJS.ProcessEnv): EnvArgs {\n const fromEnv: EnvArgs = {};\n if (env.SENTRY_ACCESS_TOKEN) fromEnv.accessToken = env.SENTRY_ACCESS_TOKEN;\n if (env.SENTRY_URL) fromEnv.url = env.SENTRY_URL;\n if (env.SENTRY_HOST) fromEnv.host = env.SENTRY_HOST;\n if (env.MCP_URL) fromEnv.mcpUrl = env.MCP_URL;\n if (env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN)\n fromEnv.sentryDsn = env.SENTRY_DSN || env.DEFAULT_SENTRY_DSN;\n\n if (env.OPENAI_MODEL) fromEnv.openaiModel = env.OPENAI_MODEL;\n if (env.ANTHROPIC_MODEL) fromEnv.anthropicModel = env.ANTHROPIC_MODEL;\n if (env.EMBEDDED_AGENT_PROVIDER)\n fromEnv.agentProvider = env.EMBEDDED_AGENT_PROVIDER;\n if (env.MCP_SKILLS) fromEnv.skills = env.MCP_SKILLS;\n return fromEnv;\n}\n\nexport function merge(cli: CliArgs, env: EnvArgs): MergedArgs {\n // CLI wins over env\n return {\n accessToken: cli.accessToken ?? env.accessToken,\n // If CLI provided url/host, prefer those; else fall back to env\n url: cli.url ?? env.url,\n host: cli.host ?? env.host,\n mcpUrl: cli.mcpUrl ?? env.mcpUrl,\n sentryDsn: cli.sentryDsn ?? env.sentryDsn,\n openaiBaseUrl: cli.openaiBaseUrl,\n openaiModel: cli.openaiModel ?? env.openaiModel,\n anthropicBaseUrl: cli.anthropicBaseUrl,\n anthropicModel: cli.anthropicModel ?? env.anthropicModel,\n agentProvider: cli.agentProvider ?? env.agentProvider,\n // Skills precedence: CLI skills override env\n skills: cli.skills ?? env.skills,\n agent: cli.agent === true,\n experimental: cli.experimental === true,\n organizationSlug: cli.organizationSlug,\n projectSlug: cli.projectSlug,\n help: cli.help === true,\n version: cli.version === true,\n unknownArgs: cli.unknownArgs,\n };\n}\n"],"mappings":";;;AAGA,SAAgB,UAAU,MAAyB;CACjD,MAAM,UAAU;EACd,gBAAgB,EAAE,MAAM,UAAmB;EAC3C,MAAM,EAAE,MAAM,UAAmB;EACjC,KAAK,EAAE,MAAM,UAAmB;EAChC,WAAW,EAAE,MAAM,UAAmB;EACtC,cAAc,EAAE,MAAM,UAAmB;EACzC,mBAAmB,EAAE,MAAM,UAAmB;EAC9C,gBAAgB,EAAE,MAAM,UAAmB;EAC3C,sBAAsB,EAAE,MAAM,UAAmB;EACjD,mBAAmB,EAAE,MAAM,UAAmB;EAC9C,kBAAkB,EAAE,MAAM,UAAmB;EAC7C,qBAAqB,EAAE,MAAM,UAAmB;EAChD,gBAAgB,EAAE,MAAM,UAAmB;EAC3C,QAAQ,EAAE,MAAM,UAAmB;EACnC,OAAO,EAAE,MAAM,WAAoB;EACnC,cAAc,EAAE,MAAM,WAAoB;EAC1C,MAAM;GAAE,MAAM;GAAoB,OAAO;GAAc;EACvD,SAAS;GAAE,MAAM;GAAoB,OAAO;GAAc;EAC3D;CAED,MAAM,EAAE,QAAQ,aAAa,WAAW,UAAU;EAChD,MAAM;EACN;EACA,kBAAkB;EAClB,QAAQ;EACR,QAAQ;EACT,CAAC;CAEF,MAAM,YAAY,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;CAC/C,MAAM,aAAa,IAAI,IAAI,CACzB,GAAI,OAAO,OAAO,QAAQ,CACvB,KAAK,MAAO,WAAW,IAAK,EAAE,QAA+B,OAAW,CACxE,OAAO,QAAQ,CACnB,CAAC;CAEF,MAAM,cAAwB,EAAE;AAChC,MAAK,MAAM,KAAM,UAAoB,EAAE,CACrC,KAAI,EAAE,SAAS,UAAU;EACvB,MAAM,OAAO,EAAE;AACf,MAAI,QAAQ,EAAE,UAAU,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,EACvD,aAAY,KAAM,EAAE,OAAkB,KAAK,OAAO;YAE3C,EAAE,SAAS,aACpB,aAAY,KAAM,EAAE,OAAkB,OAAO,EAAE,SAAS,GAAG,CAAC;AAIhE,QAAO;EACL,aAAa,OAAO;EACpB,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,aAAa,OAAO;EACpB,kBAAkB,OAAO;EACzB,gBAAgB,OAAO;EACvB,eAAe,OAAO;EACtB,kBAAkB,OAAO;EACzB,aAAa,OAAO;EACpB,QAAQ,OAAO;EACf,OAAO,OAAO,UAAU;EACxB,cAAc,OAAO,iBAAiB;EACtC,MAAO,OAAO,SAAiC;EAC/C,SAAU,OAAO,YAAoC;EACrD,aACE,YAAY,SAAS,IAAI,cAAe,eAA4B,EAAE;EACzE;;AAGH,SAAgB,SAAS,KAAiC;CACxD,MAAM,UAAmB,EAAE;AAC3B,KAAI,IAAI,oBAAqB,SAAQ,cAAc,IAAI;AACvD,KAAI,IAAI,WAAY,SAAQ,MAAM,IAAI;AACtC,KAAI,IAAI,YAAa,SAAQ,OAAO,IAAI;AACxC,KAAI,IAAI,QAAS,SAAQ,SAAS,IAAI;AACtC,KAAI,IAAI,cAAc,IAAI,mBACxB,SAAQ,YAAY,IAAI,cAAc,IAAI;AAE5C,KAAI,IAAI,aAAc,SAAQ,cAAc,IAAI;AAChD,KAAI,IAAI,gBAAiB,SAAQ,iBAAiB,IAAI;AACtD,KAAI,IAAI,wBACN,SAAQ,gBAAgB,IAAI;AAC9B,KAAI,IAAI,WAAY,SAAQ,SAAS,IAAI;AACzC,QAAO;;AAGT,SAAgB,MAAM,KAAc,KAA0B;AAE5D,QAAO;EACL,aAAa,IAAI,eAAe,IAAI;EAEpC,KAAK,IAAI,OAAO,IAAI;EACpB,MAAM,IAAI,QAAQ,IAAI;EACtB,QAAQ,IAAI,UAAU,IAAI;EAC1B,WAAW,IAAI,aAAa,IAAI;EAChC,eAAe,IAAI;EACnB,aAAa,IAAI,eAAe,IAAI;EACpC,kBAAkB,IAAI;EACtB,gBAAgB,IAAI,kBAAkB,IAAI;EAC1C,eAAe,IAAI,iBAAiB,IAAI;EAExC,QAAQ,IAAI,UAAU,IAAI;EAC1B,OAAO,IAAI,UAAU;EACrB,cAAc,IAAI,iBAAiB;EACnC,kBAAkB,IAAI;EACtB,aAAa,IAAI;EACjB,MAAM,IAAI,SAAS;EACnB,SAAS,IAAI,YAAY;EACzB,aAAa,IAAI;EAClB"}
@@ -1,10 +0,0 @@
1
- import { MergedArgs, ResolvedConfig } from "./types-CnTkIHzd.js";
2
-
3
- //#region src/cli/resolve.d.ts
4
- declare function formatInvalidSkills(invalid: string[], envName?: string): string;
5
- declare function finalize(input: MergedArgs): ResolvedConfig;
6
- //# sourceMappingURL=resolve.d.ts.map
7
-
8
- //#endregion
9
- export { finalize, formatInvalidSkills };
10
- //# sourceMappingURL=resolve-BVtyZcQM.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-BVtyZcQM.d.ts","names":[],"sources":["../../src/cli/resolve.ts"],"sourcesContent":[],"mappings":";;;iBAQgB,mBAAA;iBASA,QAAA,QAAgB,aAAa;AAT7C"}
@@ -1,10 +0,0 @@
1
- import { MergedArgs, ResolvedConfig } from "./types-VWgo1wm6.cjs";
2
-
3
- //#region src/cli/resolve.d.ts
4
- declare function formatInvalidSkills(invalid: string[], envName?: string): string;
5
- declare function finalize(input: MergedArgs): ResolvedConfig;
6
- //# sourceMappingURL=resolve.d.ts.map
7
-
8
- //#endregion
9
- export { finalize, formatInvalidSkills };
10
- //# sourceMappingURL=resolve-C3hwH129.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-C3hwH129.d.cts","names":[],"sources":["../../src/cli/resolve.ts"],"sourcesContent":[],"mappings":";;;iBAQgB,mBAAA;iBASA,QAAA,QAAgB,aAAa;AAT7C"}
@@ -1,56 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_skills = require('../skills-DOgs9MAy.cjs');
3
- const require_url_utils = require('../url-utils-N2ExJl9F.cjs');
4
-
5
- //#region src/cli/resolve.ts
6
- function formatInvalidSkills(invalid, envName) {
7
- const where = envName ? `${envName} provided` : "Invalid skills provided";
8
- const allSkills = Object.keys(require_skills.SKILLS).join(", ");
9
- return `Error: ${where}: ${invalid.join(", ")}\nAvailable skills: ${allSkills}`;
10
- }
11
- function finalize(input) {
12
- if (!input.accessToken) throw new Error("Error: No access token was provided. Pass one with `--access-token` or via `SENTRY_ACCESS_TOKEN`.");
13
- let sentryHost = "sentry.io";
14
- if (input.url) sentryHost = require_url_utils.validateAndParseSentryUrlThrows(input.url);
15
- else if (input.host) {
16
- require_url_utils.validateSentryHostThrows(input.host);
17
- sentryHost = input.host;
18
- }
19
- let finalSkills = void 0;
20
- if (input.skills) {
21
- const { valid, invalid } = require_skills.parseSkills(input.skills);
22
- if (invalid.length > 0) throw new Error(formatInvalidSkills(invalid));
23
- if (valid.size === 0) throw new Error("Error: Invalid skills provided. No valid skills found.");
24
- finalSkills = valid;
25
- } else {
26
- const allSkills = Object.keys(require_skills.SKILLS);
27
- finalSkills = new Set(allSkills);
28
- }
29
- const resolvedOpenAiBaseUrl = input.openaiBaseUrl ? require_url_utils.validateOpenAiBaseUrlThrows(input.openaiBaseUrl) : void 0;
30
- const resolvedAnthropicBaseUrl = input.anthropicBaseUrl ? require_url_utils.validateOpenAiBaseUrlThrows(input.anthropicBaseUrl) : void 0;
31
- let agentProvider = void 0;
32
- if (input.agentProvider) {
33
- const provider = input.agentProvider.toLowerCase();
34
- if (provider !== "openai" && provider !== "anthropic") throw new Error(`Error: Invalid agent provider "${input.agentProvider}". Must be "openai" or "anthropic".`);
35
- agentProvider = provider;
36
- }
37
- return {
38
- accessToken: input.accessToken,
39
- sentryHost,
40
- mcpUrl: input.mcpUrl,
41
- sentryDsn: input.sentryDsn,
42
- openaiBaseUrl: resolvedOpenAiBaseUrl,
43
- openaiModel: input.openaiModel,
44
- anthropicBaseUrl: resolvedAnthropicBaseUrl,
45
- anthropicModel: input.anthropicModel,
46
- agentProvider,
47
- finalSkills,
48
- organizationSlug: input.organizationSlug,
49
- projectSlug: input.projectSlug
50
- };
51
- }
52
-
53
- //#endregion
54
- exports.finalize = finalize;
55
- exports.formatInvalidSkills = formatInvalidSkills;
56
- //# sourceMappingURL=resolve.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve.cjs","names":["SKILLS","validateAndParseSentryUrlThrows","parseSkills","validateOpenAiBaseUrlThrows"],"sources":["../../src/cli/resolve.ts"],"sourcesContent":["import { parseSkills, SKILLS, type Skill } from \"@sentry/mcp-core/skills\";\nimport {\n validateAndParseSentryUrlThrows,\n validateOpenAiBaseUrlThrows,\n validateSentryHostThrows,\n} from \"@sentry/mcp-core/utils/url-utils\";\nimport type { MergedArgs, ResolvedConfig } from \"./types\";\n\nexport function formatInvalidSkills(\n invalid: string[],\n envName?: string,\n): string {\n const where = envName ? `${envName} provided` : \"Invalid skills provided\";\n const allSkills = Object.keys(SKILLS).join(\", \");\n return `Error: ${where}: ${invalid.join(\", \")}\\nAvailable skills: ${allSkills}`;\n}\n\nexport function finalize(input: MergedArgs): ResolvedConfig {\n // Access token required\n if (!input.accessToken) {\n throw new Error(\n \"Error: No access token was provided. Pass one with `--access-token` or via `SENTRY_ACCESS_TOKEN`.\",\n );\n }\n\n // Determine host from url/host with validation\n let sentryHost = \"sentry.io\";\n if (input.url) {\n sentryHost = validateAndParseSentryUrlThrows(input.url);\n } else if (input.host) {\n validateSentryHostThrows(input.host);\n sentryHost = input.host;\n }\n\n // Skills resolution\n //\n // IMPORTANT: stdio (CLI) intentionally defaults to ALL skills when no --skills flag is provided\n //\n // This differs from the OAuth flow, which requires explicit user selection:\n // - stdio/CLI: Non-interactive, defaults to ALL skills (inspect, docs, seer, triage, project-management)\n // - OAuth: Interactive, requires user to explicitly select skills (with sensible defaults pre-checked)\n //\n // Rationale:\n // We don't want the MCP to break if users don't specify skills. stdio is typically used in\n // local development and CI/CD environments where maximum access by default is expected.\n // OAuth is used in multi-tenant hosted environments where users should consciously grant\n // permissions on a per-app basis.\n //\n // For OAuth validation that enforces minimum 1 skill selection, see:\n // packages/mcp-cloudflare/src/server/oauth/routes/callback.ts (lines 234-248)\n //\n let finalSkills: Set<Skill> | undefined = undefined;\n if (input.skills) {\n // Override: use only the specified skills\n const { valid, invalid } = parseSkills(input.skills);\n if (invalid.length > 0) {\n throw new Error(formatInvalidSkills(invalid));\n }\n if (valid.size === 0) {\n throw new Error(\"Error: Invalid skills provided. No valid skills found.\");\n }\n finalSkills = valid;\n } else {\n // Default: grant ALL skills when no flag is provided (see comment block above for rationale)\n const allSkills = Object.keys(SKILLS) as Skill[];\n finalSkills = new Set<Skill>(allSkills);\n }\n\n const resolvedOpenAiBaseUrl = input.openaiBaseUrl\n ? validateOpenAiBaseUrlThrows(input.openaiBaseUrl)\n : undefined;\n\n // Validate anthropic base URL if provided (same validation as OpenAI)\n const resolvedAnthropicBaseUrl = input.anthropicBaseUrl\n ? validateOpenAiBaseUrlThrows(input.anthropicBaseUrl)\n : undefined;\n\n // Validate agent provider if explicitly set\n let agentProvider: \"openai\" | \"anthropic\" | undefined = undefined;\n if (input.agentProvider) {\n const provider = input.agentProvider.toLowerCase();\n if (provider !== \"openai\" && provider !== \"anthropic\") {\n throw new Error(\n `Error: Invalid agent provider \"${input.agentProvider}\". Must be \"openai\" or \"anthropic\".`,\n );\n }\n agentProvider = provider;\n }\n\n return {\n accessToken: input.accessToken,\n sentryHost,\n mcpUrl: input.mcpUrl,\n sentryDsn: input.sentryDsn,\n openaiBaseUrl: resolvedOpenAiBaseUrl,\n openaiModel: input.openaiModel,\n anthropicBaseUrl: resolvedAnthropicBaseUrl,\n anthropicModel: input.anthropicModel,\n agentProvider,\n finalSkills,\n organizationSlug: input.organizationSlug,\n projectSlug: input.projectSlug,\n };\n}\n"],"mappings":";;;;;AAQA,SAAgB,oBACd,SACA,SACQ;CACR,MAAM,QAAQ,UAAU,GAAG,QAAQ,aAAa;CAChD,MAAM,YAAY,OAAO,KAAKA,sBAAO,CAAC,KAAK,KAAK;AAChD,QAAO,UAAU,MAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,sBAAsB;;AAGtE,SAAgB,SAAS,OAAmC;AAE1D,KAAI,CAAC,MAAM,YACT,OAAM,IAAI,MACR,oGACD;CAIH,IAAI,aAAa;AACjB,KAAI,MAAM,IACR,cAAaC,kDAAgC,MAAM,IAAI;UAC9C,MAAM,MAAM;AACrB,6CAAyB,MAAM,KAAK;AACpC,eAAa,MAAM;;CAoBrB,IAAI,cAAsC;AAC1C,KAAI,MAAM,QAAQ;EAEhB,MAAM,EAAE,OAAO,YAAYC,2BAAY,MAAM,OAAO;AACpD,MAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,MAAM,oBAAoB,QAAQ,CAAC;AAE/C,MAAI,MAAM,SAAS,EACjB,OAAM,IAAI,MAAM,yDAAyD;AAE3E,gBAAc;QACT;EAEL,MAAM,YAAY,OAAO,KAAKF,sBAAO;AACrC,gBAAc,IAAI,IAAW,UAAU;;CAGzC,MAAM,wBAAwB,MAAM,gBAChCG,8CAA4B,MAAM,cAAc,GAChD;CAGJ,MAAM,2BAA2B,MAAM,mBACnCA,8CAA4B,MAAM,iBAAiB,GACnD;CAGJ,IAAI,gBAAoD;AACxD,KAAI,MAAM,eAAe;EACvB,MAAM,WAAW,MAAM,cAAc,aAAa;AAClD,MAAI,aAAa,YAAY,aAAa,YACxC,OAAM,IAAI,MACR,kCAAkC,MAAM,cAAc,qCACvD;AAEH,kBAAgB;;AAGlB,QAAO;EACL,aAAa,MAAM;EACnB;EACA,QAAQ,MAAM;EACd,WAAW,MAAM;EACjB,eAAe;EACf,aAAa,MAAM;EACnB,kBAAkB;EAClB,gBAAgB,MAAM;EACtB;EACA;EACA,kBAAkB,MAAM;EACxB,aAAa,MAAM;EACpB"}
@@ -1,54 +0,0 @@
1
- import { i as parseSkills, n as SKILLS } from "../skills-DfqlqYXj.js";
2
- import { a as validateAndParseSentryUrlThrows, o as validateOpenAiBaseUrlThrows, s as validateSentryHostThrows } from "../url-utils-BHhxlntO.js";
3
-
4
- //#region src/cli/resolve.ts
5
- function formatInvalidSkills(invalid, envName) {
6
- const where = envName ? `${envName} provided` : "Invalid skills provided";
7
- const allSkills = Object.keys(SKILLS).join(", ");
8
- return `Error: ${where}: ${invalid.join(", ")}\nAvailable skills: ${allSkills}`;
9
- }
10
- function finalize(input) {
11
- if (!input.accessToken) throw new Error("Error: No access token was provided. Pass one with `--access-token` or via `SENTRY_ACCESS_TOKEN`.");
12
- let sentryHost = "sentry.io";
13
- if (input.url) sentryHost = validateAndParseSentryUrlThrows(input.url);
14
- else if (input.host) {
15
- validateSentryHostThrows(input.host);
16
- sentryHost = input.host;
17
- }
18
- let finalSkills = void 0;
19
- if (input.skills) {
20
- const { valid, invalid } = parseSkills(input.skills);
21
- if (invalid.length > 0) throw new Error(formatInvalidSkills(invalid));
22
- if (valid.size === 0) throw new Error("Error: Invalid skills provided. No valid skills found.");
23
- finalSkills = valid;
24
- } else {
25
- const allSkills = Object.keys(SKILLS);
26
- finalSkills = new Set(allSkills);
27
- }
28
- const resolvedOpenAiBaseUrl = input.openaiBaseUrl ? validateOpenAiBaseUrlThrows(input.openaiBaseUrl) : void 0;
29
- const resolvedAnthropicBaseUrl = input.anthropicBaseUrl ? validateOpenAiBaseUrlThrows(input.anthropicBaseUrl) : void 0;
30
- let agentProvider = void 0;
31
- if (input.agentProvider) {
32
- const provider = input.agentProvider.toLowerCase();
33
- if (provider !== "openai" && provider !== "anthropic") throw new Error(`Error: Invalid agent provider "${input.agentProvider}". Must be "openai" or "anthropic".`);
34
- agentProvider = provider;
35
- }
36
- return {
37
- accessToken: input.accessToken,
38
- sentryHost,
39
- mcpUrl: input.mcpUrl,
40
- sentryDsn: input.sentryDsn,
41
- openaiBaseUrl: resolvedOpenAiBaseUrl,
42
- openaiModel: input.openaiModel,
43
- anthropicBaseUrl: resolvedAnthropicBaseUrl,
44
- anthropicModel: input.anthropicModel,
45
- agentProvider,
46
- finalSkills,
47
- organizationSlug: input.organizationSlug,
48
- projectSlug: input.projectSlug
49
- };
50
- }
51
-
52
- //#endregion
53
- export { finalize, formatInvalidSkills };
54
- //# sourceMappingURL=resolve.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve.js","names":[],"sources":["../../src/cli/resolve.ts"],"sourcesContent":["import { parseSkills, SKILLS, type Skill } from \"@sentry/mcp-core/skills\";\nimport {\n validateAndParseSentryUrlThrows,\n validateOpenAiBaseUrlThrows,\n validateSentryHostThrows,\n} from \"@sentry/mcp-core/utils/url-utils\";\nimport type { MergedArgs, ResolvedConfig } from \"./types\";\n\nexport function formatInvalidSkills(\n invalid: string[],\n envName?: string,\n): string {\n const where = envName ? `${envName} provided` : \"Invalid skills provided\";\n const allSkills = Object.keys(SKILLS).join(\", \");\n return `Error: ${where}: ${invalid.join(\", \")}\\nAvailable skills: ${allSkills}`;\n}\n\nexport function finalize(input: MergedArgs): ResolvedConfig {\n // Access token required\n if (!input.accessToken) {\n throw new Error(\n \"Error: No access token was provided. Pass one with `--access-token` or via `SENTRY_ACCESS_TOKEN`.\",\n );\n }\n\n // Determine host from url/host with validation\n let sentryHost = \"sentry.io\";\n if (input.url) {\n sentryHost = validateAndParseSentryUrlThrows(input.url);\n } else if (input.host) {\n validateSentryHostThrows(input.host);\n sentryHost = input.host;\n }\n\n // Skills resolution\n //\n // IMPORTANT: stdio (CLI) intentionally defaults to ALL skills when no --skills flag is provided\n //\n // This differs from the OAuth flow, which requires explicit user selection:\n // - stdio/CLI: Non-interactive, defaults to ALL skills (inspect, docs, seer, triage, project-management)\n // - OAuth: Interactive, requires user to explicitly select skills (with sensible defaults pre-checked)\n //\n // Rationale:\n // We don't want the MCP to break if users don't specify skills. stdio is typically used in\n // local development and CI/CD environments where maximum access by default is expected.\n // OAuth is used in multi-tenant hosted environments where users should consciously grant\n // permissions on a per-app basis.\n //\n // For OAuth validation that enforces minimum 1 skill selection, see:\n // packages/mcp-cloudflare/src/server/oauth/routes/callback.ts (lines 234-248)\n //\n let finalSkills: Set<Skill> | undefined = undefined;\n if (input.skills) {\n // Override: use only the specified skills\n const { valid, invalid } = parseSkills(input.skills);\n if (invalid.length > 0) {\n throw new Error(formatInvalidSkills(invalid));\n }\n if (valid.size === 0) {\n throw new Error(\"Error: Invalid skills provided. No valid skills found.\");\n }\n finalSkills = valid;\n } else {\n // Default: grant ALL skills when no flag is provided (see comment block above for rationale)\n const allSkills = Object.keys(SKILLS) as Skill[];\n finalSkills = new Set<Skill>(allSkills);\n }\n\n const resolvedOpenAiBaseUrl = input.openaiBaseUrl\n ? validateOpenAiBaseUrlThrows(input.openaiBaseUrl)\n : undefined;\n\n // Validate anthropic base URL if provided (same validation as OpenAI)\n const resolvedAnthropicBaseUrl = input.anthropicBaseUrl\n ? validateOpenAiBaseUrlThrows(input.anthropicBaseUrl)\n : undefined;\n\n // Validate agent provider if explicitly set\n let agentProvider: \"openai\" | \"anthropic\" | undefined = undefined;\n if (input.agentProvider) {\n const provider = input.agentProvider.toLowerCase();\n if (provider !== \"openai\" && provider !== \"anthropic\") {\n throw new Error(\n `Error: Invalid agent provider \"${input.agentProvider}\". Must be \"openai\" or \"anthropic\".`,\n );\n }\n agentProvider = provider;\n }\n\n return {\n accessToken: input.accessToken,\n sentryHost,\n mcpUrl: input.mcpUrl,\n sentryDsn: input.sentryDsn,\n openaiBaseUrl: resolvedOpenAiBaseUrl,\n openaiModel: input.openaiModel,\n anthropicBaseUrl: resolvedAnthropicBaseUrl,\n anthropicModel: input.anthropicModel,\n agentProvider,\n finalSkills,\n organizationSlug: input.organizationSlug,\n projectSlug: input.projectSlug,\n };\n}\n"],"mappings":";;;;AAQA,SAAgB,oBACd,SACA,SACQ;CACR,MAAM,QAAQ,UAAU,GAAG,QAAQ,aAAa;CAChD,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,KAAK,KAAK;AAChD,QAAO,UAAU,MAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,sBAAsB;;AAGtE,SAAgB,SAAS,OAAmC;AAE1D,KAAI,CAAC,MAAM,YACT,OAAM,IAAI,MACR,oGACD;CAIH,IAAI,aAAa;AACjB,KAAI,MAAM,IACR,cAAa,gCAAgC,MAAM,IAAI;UAC9C,MAAM,MAAM;AACrB,2BAAyB,MAAM,KAAK;AACpC,eAAa,MAAM;;CAoBrB,IAAI,cAAsC;AAC1C,KAAI,MAAM,QAAQ;EAEhB,MAAM,EAAE,OAAO,YAAY,YAAY,MAAM,OAAO;AACpD,MAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,MAAM,oBAAoB,QAAQ,CAAC;AAE/C,MAAI,MAAM,SAAS,EACjB,OAAM,IAAI,MAAM,yDAAyD;AAE3E,gBAAc;QACT;EAEL,MAAM,YAAY,OAAO,KAAK,OAAO;AACrC,gBAAc,IAAI,IAAW,UAAU;;CAGzC,MAAM,wBAAwB,MAAM,gBAChC,4BAA4B,MAAM,cAAc,GAChD;CAGJ,MAAM,2BAA2B,MAAM,mBACnC,4BAA4B,MAAM,iBAAiB,GACnD;CAGJ,IAAI,gBAAoD;AACxD,KAAI,MAAM,eAAe;EACvB,MAAM,WAAW,MAAM,cAAc,aAAa;AAClD,MAAI,aAAa,YAAY,aAAa,YACxC,OAAM,IAAI,MACR,kCAAkC,MAAM,cAAc,qCACvD;AAEH,kBAAgB;;AAGlB,QAAO;EACL,aAAa,MAAM;EACnB;EACA,QAAQ,MAAM;EACd,WAAW,MAAM;EACjB,eAAe;EACf,aAAa,MAAM;EACnB,kBAAkB;EAClB,gBAAgB,MAAM;EACtB;EACA;EACA,kBAAkB,MAAM;EACxB,aAAa,MAAM;EACpB"}
@@ -1,73 +0,0 @@
1
- import { Skill } from "@sentry/mcp-core/skills";
2
-
3
- //#region src/cli/types.d.ts
4
- type CliArgs = {
5
- accessToken?: string;
6
- host?: string;
7
- url?: string;
8
- mcpUrl?: string;
9
- sentryDsn?: string;
10
- openaiBaseUrl?: string;
11
- openaiModel?: string;
12
- anthropicBaseUrl?: string;
13
- anthropicModel?: string;
14
- agentProvider?: string;
15
- skills?: string;
16
- agent?: boolean;
17
- experimental?: boolean;
18
- organizationSlug?: string;
19
- projectSlug?: string;
20
- help?: boolean;
21
- version?: boolean;
22
- unknownArgs: string[];
23
- };
24
- type EnvArgs = {
25
- accessToken?: string;
26
- host?: string;
27
- url?: string;
28
- mcpUrl?: string;
29
- sentryDsn?: string;
30
- openaiModel?: string;
31
- anthropicModel?: string;
32
- agentProvider?: string;
33
- skills?: string;
34
- };
35
- type MergedArgs = {
36
- accessToken?: string;
37
- host?: string;
38
- url?: string;
39
- mcpUrl?: string;
40
- sentryDsn?: string;
41
- openaiBaseUrl?: string;
42
- openaiModel?: string;
43
- anthropicBaseUrl?: string;
44
- anthropicModel?: string;
45
- agentProvider?: string;
46
- skills?: string;
47
- agent?: boolean;
48
- experimental?: boolean;
49
- organizationSlug?: string;
50
- projectSlug?: string;
51
- help?: boolean;
52
- version?: boolean;
53
- unknownArgs: string[];
54
- };
55
- type ResolvedConfig = {
56
- accessToken: string;
57
- sentryHost: string;
58
- mcpUrl?: string;
59
- sentryDsn?: string;
60
- openaiBaseUrl?: string;
61
- openaiModel?: string;
62
- anthropicBaseUrl?: string;
63
- anthropicModel?: string;
64
- agentProvider?: "openai" | "anthropic";
65
- /** Primary authorization method */
66
- finalSkills?: Set<Skill>;
67
- organizationSlug?: string;
68
- projectSlug?: string;
69
- };
70
- //# sourceMappingURL=types.d.ts.map
71
- //#endregion
72
- export { CliArgs, EnvArgs, MergedArgs, ResolvedConfig };
73
- //# sourceMappingURL=types-CnTkIHzd.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CnTkIHzd.d.ts","names":[],"sources":["../../src/cli/types.ts"],"sourcesContent":[],"mappings":";;;KAEY,OAAA;;EAAA,IAAA,CAAA,EAAA,MAAO;EAqBP,GAAA,CAAA,EAAA,MAAO;EAYP,MAAA,CAAA,EAAA,MAAU;EAqBV,SAAA,CAAA,EAAA,MAAc;EAAA,aAAA,CAAA,EAAA,MAAA;aAWN,CAAA,EAAA,MAAA;kBAAJ,CAAA,EAAA,MAAA;EAAG,cAAA,CAAA,EAAA,MAAA;;;;;;;;;;;KA5CP,OAAA;;;;;;;;;;;KAYA,UAAA;;;;;;;;;;;;;;;;;;;;KAqBA,cAAA;;;;;;;;;;;gBAWI,IAAI"}
@@ -1,73 +0,0 @@
1
- import { Skill } from "@sentry/mcp-core/skills";
2
-
3
- //#region src/cli/types.d.ts
4
- type CliArgs = {
5
- accessToken?: string;
6
- host?: string;
7
- url?: string;
8
- mcpUrl?: string;
9
- sentryDsn?: string;
10
- openaiBaseUrl?: string;
11
- openaiModel?: string;
12
- anthropicBaseUrl?: string;
13
- anthropicModel?: string;
14
- agentProvider?: string;
15
- skills?: string;
16
- agent?: boolean;
17
- experimental?: boolean;
18
- organizationSlug?: string;
19
- projectSlug?: string;
20
- help?: boolean;
21
- version?: boolean;
22
- unknownArgs: string[];
23
- };
24
- type EnvArgs = {
25
- accessToken?: string;
26
- host?: string;
27
- url?: string;
28
- mcpUrl?: string;
29
- sentryDsn?: string;
30
- openaiModel?: string;
31
- anthropicModel?: string;
32
- agentProvider?: string;
33
- skills?: string;
34
- };
35
- type MergedArgs = {
36
- accessToken?: string;
37
- host?: string;
38
- url?: string;
39
- mcpUrl?: string;
40
- sentryDsn?: string;
41
- openaiBaseUrl?: string;
42
- openaiModel?: string;
43
- anthropicBaseUrl?: string;
44
- anthropicModel?: string;
45
- agentProvider?: string;
46
- skills?: string;
47
- agent?: boolean;
48
- experimental?: boolean;
49
- organizationSlug?: string;
50
- projectSlug?: string;
51
- help?: boolean;
52
- version?: boolean;
53
- unknownArgs: string[];
54
- };
55
- type ResolvedConfig = {
56
- accessToken: string;
57
- sentryHost: string;
58
- mcpUrl?: string;
59
- sentryDsn?: string;
60
- openaiBaseUrl?: string;
61
- openaiModel?: string;
62
- anthropicBaseUrl?: string;
63
- anthropicModel?: string;
64
- agentProvider?: "openai" | "anthropic";
65
- /** Primary authorization method */
66
- finalSkills?: Set<Skill>;
67
- organizationSlug?: string;
68
- projectSlug?: string;
69
- };
70
- //# sourceMappingURL=types.d.ts.map
71
- //#endregion
72
- export { CliArgs, EnvArgs, MergedArgs, ResolvedConfig };
73
- //# sourceMappingURL=types-VWgo1wm6.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-VWgo1wm6.d.cts","names":[],"sources":["../../src/cli/types.ts"],"sourcesContent":[],"mappings":";;;KAEY,OAAA;;EAAA,IAAA,CAAA,EAAA,MAAO;EAqBP,GAAA,CAAA,EAAA,MAAO;EAYP,MAAA,CAAA,EAAA,MAAU;EAqBV,SAAA,CAAA,EAAA,MAAc;EAAA,aAAA,CAAA,EAAA,MAAA;aAWN,CAAA,EAAA,MAAA;kBAAJ,CAAA,EAAA,MAAA;EAAG,cAAA,CAAA,EAAA,MAAA;;;;;;;;;;;KA5CP,OAAA;;;;;;;;;;;KAYA,UAAA;;;;;;;;;;;;;;;;;;;;KAqBA,cAAA;;;;;;;;;;;gBAWI,IAAI"}
File without changes
package/dist/cli/types.js DELETED
@@ -1 +0,0 @@
1
- export { };
@@ -1,9 +0,0 @@
1
- import { Skill } from "@sentry/mcp-core/skills";
2
-
3
- //#region src/cli/usage.d.ts
4
- declare function buildUsage(packageName: string, allSkills: ReadonlyArray<Skill>): string;
5
- //# sourceMappingURL=usage.d.ts.map
6
-
7
- //#endregion
8
- export { buildUsage };
9
- //# sourceMappingURL=usage-B0gAPy4S.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage-B0gAPy4S.d.cts","names":[],"sources":["../../src/cli/usage.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,UAAA,iCAEH,cAAc"}
@@ -1,9 +0,0 @@
1
- import { Skill } from "@sentry/mcp-core/skills";
2
-
3
- //#region src/cli/usage.d.ts
4
- declare function buildUsage(packageName: string, allSkills: ReadonlyArray<Skill>): string;
5
- //# sourceMappingURL=usage.d.ts.map
6
-
7
- //#endregion
8
- export { buildUsage };
9
- //# sourceMappingURL=usage-BhCVaC5j.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage-BhCVaC5j.d.ts","names":[],"sources":["../../src/cli/usage.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,UAAA,iCAEH,cAAc"}
@@ -1,47 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
3
- //#region src/cli/usage.ts
4
- function buildUsage(packageName, allSkills) {
5
- return `Usage: ${packageName} --access-token=<token> [--host=<host>]
6
-
7
- Required:
8
- --access-token <token> Sentry User Auth Token with API access
9
-
10
- Common optional flags:
11
- --host <host> Change Sentry host (self-hosted)
12
- --sentry-dsn <dsn> Override DSN used for telemetry reporting
13
- --agent Agent mode: only expose use_sentry tool (for AI agents)
14
- --experimental Enable experimental tools (hidden by default)
15
-
16
- Embedded agent configuration:
17
- --agent-provider <provider> LLM provider: openai or anthropic (auto-detects from API keys)
18
- --openai-base-url <url> Override OpenAI API base URL
19
- --openai-model <model> Override OpenAI model (default: gpt-5)
20
- --anthropic-base-url <url> Override Anthropic API base URL
21
- --anthropic-model <model> Override Anthropic model (default: claude-sonnet-4-5)
22
-
23
- Session constraints:
24
- --organization-slug <slug> Force all calls to an organization
25
- --project-slug <slug> Optional project constraint
26
-
27
- Skill controls:
28
- --skills <list> Specify which skills to grant (default: all skills)
29
-
30
- All skills: ${allSkills.join(", ")}
31
-
32
- Environment variables:
33
- SENTRY_ACCESS_TOKEN Sentry auth token (alternative to --access-token)
34
- OPENAI_API_KEY OpenAI API key for AI-powered search tools
35
- ANTHROPIC_API_KEY Anthropic API key for AI-powered search tools
36
- EMBEDDED_AGENT_PROVIDER Provider override: openai or anthropic
37
-
38
- Examples:
39
- ${packageName} --access-token=TOKEN
40
- ${packageName} --access-token=TOKEN --skills=inspect,triage
41
- ${packageName} --access-token=TOKEN --host=sentry.example.com
42
- ${packageName} --access-token=TOKEN --agent-provider=anthropic`;
43
- }
44
-
45
- //#endregion
46
- exports.buildUsage = buildUsage;
47
- //# sourceMappingURL=usage.cjs.map