@aaa-sentinel/mcp-server 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +3 -0
  2. package/dist/cli.js +49 -1
  3. package/package.json +45 -45
package/README.md CHANGED
@@ -117,6 +117,9 @@ status as plain JSON.
117
117
  | `get_security_posture_history` | `accountId` or `clientId`, `days?` | `security:read` | Pro + risk and compliance add-on |
118
118
  | `get_account` | `accountId` | `accounts:read` | Pro |
119
119
  | `get_account_monthly_costs` | `accountId` | `accounts:read` | Pro |
120
+ | `list_architecture_apps` | `accountId`, `limit?`, `cursor?` | `accounts:read` | Pro |
121
+ | `get_architecture_app` | `accountId`, `appId`, `limit?`, `cursor?` | `accounts:read` | Pro |
122
+ | `get_architecture_graph` | `accountId`, `app?` | `accounts:read` | Pro |
120
123
  | `get_cost_history` | `accountId` | `reports:read` | Pro |
121
124
  | `get_cost_by_tags` | `accountId` | `reports:read` | Pro |
122
125
  | `get_multicloud_report` | — | `reports:read` | Pro |
package/dist/cli.js CHANGED
@@ -6330,6 +6330,54 @@ var TOOLS = [
6330
6330
  argsSchema: object({ accountId: string2().min(1) }),
6331
6331
  handler: async ({ accountId }, config2) => apiGet(`/v1/accounts/${encodeURIComponent(accountId)}/monthly-costs`, void 0, config2)
6332
6332
  }),
6333
+ // ── Mapa de arquitectura ───────────────────────────────────
6334
+ defineTool({
6335
+ name: "list_architecture_apps",
6336
+ description: 'List the applications of one cloud account in the architecture map (AWS today; other providers return supported false), most expensive first. Each application comes from a tag (source "tag"), a CloudFormation stack ("stack"), a manual grouping ("manual") or a suggestion not yet confirmed ("suggested"), with its component count, regions, monthlyUsd (sum of priced components, null when none has a price), cost findings and their savingsUsd, and tag coverage. unassigned summarizes components with no application. Amounts: fields ending in Usd are monthly estimates in USD; the sibling without the suffix (monthly, savings) is the same amount in the organization currency (currency.code, approximate). snapshot says which map version this is (builtAt) and what could not be read. Configuration metadata only, never traffic or contents. Paginated: pass nextCursor as cursor; a cursor from before the map changed is rejected and you start again. Requires the accounts:read scope.',
6337
+ inputSchema: objectWith(
6338
+ {
6339
+ accountId: ACCOUNT_ID,
6340
+ limit: { type: "integer", minimum: 1, maximum: 500, description: "Page size (1-500, default 100)." },
6341
+ cursor: CURSOR
6342
+ },
6343
+ ["accountId"]
6344
+ ),
6345
+ argsSchema: object({ accountId: string2().min(1), limit: number2().int().min(1).max(500).optional(), cursor: string2().min(1).optional() }),
6346
+ handler: async ({ accountId, limit, cursor }, config2) => apiGet(`/v1/architecture/accounts/${encodeURIComponent(accountId)}/apps`, { limit: asText(limit), cursor }, config2)
6347
+ }),
6348
+ defineTool({
6349
+ name: "get_architecture_app",
6350
+ description: 'Get one application of the architecture map with its components, most expensive first: type, region, customer tags, monthlyUsd (null means no known price), cost findings and savingsUsd, whether it is reachable from the internet (exposed) and how it was assigned (assignedBy: tag, manual, stack, suggested or none). Amounts: fields ending in Usd are monthly estimates in USD; the sibling without the suffix (monthly, savings) is the same amount in the organization currency (currency.code, approximate). Use appId "unassigned" for components with no application. Paginated like list_architecture_apps. Requires the accounts:read scope.',
6351
+ inputSchema: objectWith(
6352
+ {
6353
+ accountId: ACCOUNT_ID,
6354
+ appId: { type: "string", description: 'Application identifier, as returned by list_architecture_apps, or "unassigned".' },
6355
+ limit: { type: "integer", minimum: 1, maximum: 1e3, description: "Page size (1-1000, default 200)." },
6356
+ cursor: CURSOR
6357
+ },
6358
+ ["accountId", "appId"]
6359
+ ),
6360
+ argsSchema: object({
6361
+ accountId: string2().min(1),
6362
+ appId: string2().min(1),
6363
+ limit: number2().int().min(1).max(1e3).optional(),
6364
+ cursor: string2().min(1).optional()
6365
+ }),
6366
+ handler: async ({ accountId, appId, limit, cursor }, config2) => apiGet(`/v1/architecture/accounts/${encodeURIComponent(accountId)}/apps/${encodeURIComponent(appId)}`, { limit: asText(limit), cursor }, config2)
6367
+ }),
6368
+ defineTool({
6369
+ name: "get_architecture_graph",
6370
+ description: 'Get how things connect in the architecture map. Without app: one card per application and the links between applications (counts of configured, allowed and resilience connections), plus the internet and outside accounts they talk to. With app: its components (nodes), the edges that touch them, the endpoints outside the application and the network containers (region, VPC, subnet). Every edge says where it comes from: kind "configured" (configuration links A to B) or "allowed" (a network rule permits it), its relation (invokes, routes_to, subscribes, network_allows...) and proof (the provider API call and identifier that show it); never observed traffic, so do not describe edges as traffic. Bounded to 1,500 components and 4,000 edges per application (truncated says so); a large application can return several megabytes, so call it with app only when you need the connections, and use get_architecture_app (paginated) to list components. Amounts: fields ending in Usd are monthly estimates in USD; the sibling without the suffix (monthly, savings) is the same amount in the organization currency (currency.code, approximate). Requires the accounts:read scope and the Pro or Business plan.',
6371
+ inputSchema: objectWith(
6372
+ {
6373
+ accountId: ACCOUNT_ID,
6374
+ app: { type: "string", description: 'Application identifier from list_architecture_apps, or "unassigned" (optional; without it, the account level).' }
6375
+ },
6376
+ ["accountId"]
6377
+ ),
6378
+ argsSchema: object({ accountId: string2().min(1), app: string2().min(1).optional() }),
6379
+ handler: async ({ accountId, app }, config2) => apiGet(`/v1/architecture/accounts/${encodeURIComponent(accountId)}/graph`, { app }, config2)
6380
+ }),
6333
6381
  defineTool({
6334
6382
  name: "get_cost_history",
6335
6383
  description: "Get the spend history of one cloud account for the last 12 months. Requires the reports:read scope and the Pro plan or above.",
@@ -6651,7 +6699,7 @@ function findTool(name) {
6651
6699
 
6652
6700
  // src/protocol.ts
6653
6701
  var SERVER_NAME = "aaa-sentinel-mcp";
6654
- var SERVER_VERSION = "0.9.0";
6702
+ var SERVER_VERSION = "0.10.0";
6655
6703
  var SUPPORTED_PROTOCOL_VERSIONS = ["2025-06-18", "2025-03-26", "2024-11-05"];
6656
6704
  var PARSE_ERROR = -32700;
6657
6705
  var INVALID_REQUEST = -32600;
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
- {
2
- "name": "@aaa-sentinel/mcp-server",
3
- "version": "0.9.0",
4
- "description": "Read-only MCP server for AAA Sentinel: query cloud costs, savings, security posture, AI spend, uptime monitoring, the remediation agent and managed clients from an AI assistant",
5
- "license": "MIT",
6
- "type": "module",
7
- "bin": {
8
- "aaa-sentinel-mcp": "dist/cli.js"
9
- },
10
- "files": [
11
- "dist"
12
- ],
13
- "keywords": [
14
- "mcp",
15
- "modelcontextprotocol",
16
- "finops",
17
- "cost",
18
- "monitoring",
19
- "uptime",
20
- "security",
21
- "ai-spend"
22
- ],
23
- "publishConfig": {
24
- "access": "public"
25
- },
26
- "homepage": "https://app.aaa-sentinel.com/developer/docs#mcp",
27
- "bugs": {
28
- "url": "https://app.aaa-sentinel.com/contact"
29
- },
30
- "engines": {
31
- "node": ">=20"
32
- },
33
- "scripts": {
34
- "build": "esbuild src/cli.ts --bundle --platform=node --format=esm --target=node20 --outfile=dist/cli.js",
35
- "prepublishOnly": "npm run build",
36
- "test": "vitest run"
37
- },
38
- "devDependencies": {
39
- "@types/node": "^22.0.0",
40
- "esbuild": "^0.24.0",
41
- "typescript": "^5.7.0",
42
- "vitest": "^3.2.0",
43
- "zod": "^4.6.7"
44
- }
45
- }
1
+ {
2
+ "name": "@aaa-sentinel/mcp-server",
3
+ "version": "0.10.0",
4
+ "description": "Read-only MCP server for AAA Sentinel: query cloud costs, savings, security posture, AI spend, uptime monitoring, the remediation agent and managed clients from an AI assistant",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "aaa-sentinel-mcp": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "keywords": [
14
+ "mcp",
15
+ "modelcontextprotocol",
16
+ "finops",
17
+ "cost",
18
+ "monitoring",
19
+ "uptime",
20
+ "security",
21
+ "ai-spend"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "homepage": "https://app.aaa-sentinel.com/developer/docs#mcp",
27
+ "bugs": {
28
+ "url": "https://app.aaa-sentinel.com/contact"
29
+ },
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "scripts": {
34
+ "build": "esbuild src/cli.ts --bundle --platform=node --format=esm --target=node20 --outfile=dist/cli.js",
35
+ "prepublishOnly": "npm run build",
36
+ "test": "vitest run"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.0.0",
40
+ "esbuild": "^0.24.0",
41
+ "typescript": "^5.7.0",
42
+ "vitest": "^3.2.0",
43
+ "zod": "^4.6.7"
44
+ }
45
+ }