@sfdxy/anypoint-connect 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +481 -0
  2. package/dist/api/AccessManagementApi.d.ts +42 -0
  3. package/dist/api/AccessManagementApi.d.ts.map +1 -0
  4. package/dist/api/AccessManagementApi.js +48 -0
  5. package/dist/api/AccessManagementApi.js.map +1 -0
  6. package/dist/api/ApiManagerApi.d.ts +87 -0
  7. package/dist/api/ApiManagerApi.d.ts.map +1 -0
  8. package/dist/api/ApiManagerApi.js +79 -0
  9. package/dist/api/ApiManagerApi.js.map +1 -0
  10. package/dist/api/CloudHub2Api.d.ts +167 -0
  11. package/dist/api/CloudHub2Api.d.ts.map +1 -0
  12. package/dist/api/CloudHub2Api.js +132 -0
  13. package/dist/api/CloudHub2Api.js.map +1 -0
  14. package/dist/api/DesignCenterApi.d.ts +118 -0
  15. package/dist/api/DesignCenterApi.d.ts.map +1 -0
  16. package/dist/api/DesignCenterApi.js +259 -0
  17. package/dist/api/DesignCenterApi.js.map +1 -0
  18. package/dist/api/ExchangeApi.d.ts +92 -0
  19. package/dist/api/ExchangeApi.d.ts.map +1 -0
  20. package/dist/api/ExchangeApi.js +74 -0
  21. package/dist/api/ExchangeApi.js.map +1 -0
  22. package/dist/api/LogsApi.d.ts +66 -0
  23. package/dist/api/LogsApi.d.ts.map +1 -0
  24. package/dist/api/LogsApi.js +175 -0
  25. package/dist/api/LogsApi.js.map +1 -0
  26. package/dist/api/MonitoringApi.d.ts +72 -0
  27. package/dist/api/MonitoringApi.d.ts.map +1 -0
  28. package/dist/api/MonitoringApi.js +133 -0
  29. package/dist/api/MonitoringApi.js.map +1 -0
  30. package/dist/api/index.d.ts +8 -0
  31. package/dist/api/index.d.ts.map +1 -0
  32. package/dist/api/index.js +8 -0
  33. package/dist/api/index.js.map +1 -0
  34. package/dist/auth/FileStore.d.ts +15 -0
  35. package/dist/auth/FileStore.d.ts.map +1 -0
  36. package/dist/auth/FileStore.js +63 -0
  37. package/dist/auth/FileStore.js.map +1 -0
  38. package/dist/auth/OAuthFlow.d.ts +36 -0
  39. package/dist/auth/OAuthFlow.d.ts.map +1 -0
  40. package/dist/auth/OAuthFlow.js +156 -0
  41. package/dist/auth/OAuthFlow.js.map +1 -0
  42. package/dist/auth/TokenManager.d.ts +40 -0
  43. package/dist/auth/TokenManager.d.ts.map +1 -0
  44. package/dist/auth/TokenManager.js +119 -0
  45. package/dist/auth/TokenManager.js.map +1 -0
  46. package/dist/auth/TokenStore.d.ts +18 -0
  47. package/dist/auth/TokenStore.d.ts.map +1 -0
  48. package/dist/auth/TokenStore.js +5 -0
  49. package/dist/auth/TokenStore.js.map +1 -0
  50. package/dist/auth/index.d.ts +5 -0
  51. package/dist/auth/index.d.ts.map +1 -0
  52. package/dist/auth/index.js +4 -0
  53. package/dist/auth/index.js.map +1 -0
  54. package/dist/cli.d.ts +7 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +28 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/client/AnypointClient.d.ts +41 -0
  59. package/dist/client/AnypointClient.d.ts.map +1 -0
  60. package/dist/client/AnypointClient.js +76 -0
  61. package/dist/client/AnypointClient.js.map +1 -0
  62. package/dist/client/Cache.d.ts +15 -0
  63. package/dist/client/Cache.d.ts.map +1 -0
  64. package/dist/client/Cache.js +42 -0
  65. package/dist/client/Cache.js.map +1 -0
  66. package/dist/client/HttpClient.d.ts +26 -0
  67. package/dist/client/HttpClient.d.ts.map +1 -0
  68. package/dist/client/HttpClient.js +69 -0
  69. package/dist/client/HttpClient.js.map +1 -0
  70. package/dist/client/RateLimiter.d.ts +20 -0
  71. package/dist/client/RateLimiter.d.ts.map +1 -0
  72. package/dist/client/RateLimiter.js +48 -0
  73. package/dist/client/RateLimiter.js.map +1 -0
  74. package/dist/commands/api.d.ts +7 -0
  75. package/dist/commands/api.d.ts.map +1 -0
  76. package/dist/commands/api.js +144 -0
  77. package/dist/commands/api.js.map +1 -0
  78. package/dist/commands/apps.d.ts +7 -0
  79. package/dist/commands/apps.d.ts.map +1 -0
  80. package/dist/commands/apps.js +156 -0
  81. package/dist/commands/apps.js.map +1 -0
  82. package/dist/commands/auth.d.ts +7 -0
  83. package/dist/commands/auth.d.ts.map +1 -0
  84. package/dist/commands/auth.js +103 -0
  85. package/dist/commands/auth.js.map +1 -0
  86. package/dist/commands/config.d.ts +7 -0
  87. package/dist/commands/config.d.ts.map +1 -0
  88. package/dist/commands/config.js +125 -0
  89. package/dist/commands/config.js.map +1 -0
  90. package/dist/commands/deploy.d.ts +7 -0
  91. package/dist/commands/deploy.d.ts.map +1 -0
  92. package/dist/commands/deploy.js +145 -0
  93. package/dist/commands/deploy.js.map +1 -0
  94. package/dist/commands/design-center.d.ts +7 -0
  95. package/dist/commands/design-center.d.ts.map +1 -0
  96. package/dist/commands/design-center.js +183 -0
  97. package/dist/commands/design-center.js.map +1 -0
  98. package/dist/commands/exchange.d.ts +7 -0
  99. package/dist/commands/exchange.d.ts.map +1 -0
  100. package/dist/commands/exchange.js +134 -0
  101. package/dist/commands/exchange.js.map +1 -0
  102. package/dist/commands/index.d.ts +7 -0
  103. package/dist/commands/index.d.ts.map +1 -0
  104. package/dist/commands/index.js +7 -0
  105. package/dist/commands/index.js.map +1 -0
  106. package/dist/commands/logs.d.ts +8 -0
  107. package/dist/commands/logs.d.ts.map +1 -0
  108. package/dist/commands/logs.js +115 -0
  109. package/dist/commands/logs.js.map +1 -0
  110. package/dist/commands/monitor.d.ts +8 -0
  111. package/dist/commands/monitor.d.ts.map +1 -0
  112. package/dist/commands/monitor.js +129 -0
  113. package/dist/commands/monitor.js.map +1 -0
  114. package/dist/index.d.ts +19 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +22 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/mcp.d.ts +7 -0
  119. package/dist/mcp.d.ts.map +1 -0
  120. package/dist/mcp.js +993 -0
  121. package/dist/mcp.js.map +1 -0
  122. package/dist/safety/guards.d.ts +27 -0
  123. package/dist/safety/guards.d.ts.map +1 -0
  124. package/dist/safety/guards.js +83 -0
  125. package/dist/safety/guards.js.map +1 -0
  126. package/dist/utils/config.d.ts +57 -0
  127. package/dist/utils/config.d.ts.map +1 -0
  128. package/dist/utils/config.js +117 -0
  129. package/dist/utils/config.js.map +1 -0
  130. package/dist/utils/formatter.d.ts +21 -0
  131. package/dist/utils/formatter.d.ts.map +1 -0
  132. package/dist/utils/formatter.js +58 -0
  133. package/dist/utils/formatter.js.map +1 -0
  134. package/dist/utils/logger.d.ts +16 -0
  135. package/dist/utils/logger.d.ts.map +1 -0
  136. package/dist/utils/logger.js +43 -0
  137. package/dist/utils/logger.js.map +1 -0
  138. package/package.json +71 -0
package/README.md ADDED
@@ -0,0 +1,481 @@
1
+ # Anypoint Connect
2
+
3
+ > CLI + MCP toolkit for Anypoint Platform — deploy, tail logs, pull metrics, manage API specs, with production safety nets.
4
+
5
+ [![CI](https://github.com/Avinava/anypoint-connect/actions/workflows/ci.yml/badge.svg)](https://github.com/Avinava/anypoint-connect/actions/workflows/ci.yml)
6
+ [![npm](https://img.shields.io/npm/v/@sfdxy/anypoint-connect)](https://www.npmjs.com/package/@sfdxy/anypoint-connect)
7
+
8
+ ```bash
9
+ npm install -g @sfdxy/anypoint-connect
10
+ ```
11
+
12
+ ---
13
+
14
+ ## Architecture
15
+
16
+ ```mermaid
17
+ graph TB
18
+ subgraph Entry["Entry Points"]
19
+ CLI["CLI — anc"]
20
+ MCP["MCP Server — stdio"]
21
+ LIB["Library — import"]
22
+ end
23
+
24
+ subgraph Core["Core"]
25
+ AC["AnypointClient<br/>Facade"]
26
+ HTTP["HttpClient<br/>Axios + Bearer"]
27
+ RL["RateLimiter"]
28
+ CACHE["Cache<br/>TTL"]
29
+ end
30
+
31
+ subgraph Auth["Auth"]
32
+ TM["TokenManager<br/>Auto-refresh"]
33
+ OAUTH["OAuthFlow<br/>Browser callback"]
34
+ FS["FileStore<br/>AES-256-GCM"]
35
+ end
36
+
37
+ subgraph APIs["Domain APIs"]
38
+ AM["AccessManagement<br/>Users, Environments"]
39
+ CH2["CloudHub2<br/>Deploy, Restart, Scale"]
40
+ LOGS["LogsApi<br/>Tail, Download"]
41
+ MON["MonitoringApi<br/>AMQL Queries"]
42
+ EX["ExchangeApi<br/>Search, Download Spec"]
43
+ APIM["ApiManagerApi<br/>Instances, Policies"]
44
+ DC["DesignCenterApi<br/>Pull, Push, Publish"]
45
+ end
46
+
47
+ subgraph Safety["Safety"]
48
+ GUARD["Production Guards<br/>Env detection, Confirmation"]
49
+ end
50
+
51
+ CLI --> AC
52
+ MCP --> AC
53
+ LIB --> AC
54
+ AC --> HTTP
55
+ AC --> CACHE
56
+ HTTP --> RL
57
+ HTTP --> TM
58
+ TM --> OAUTH
59
+ TM --> FS
60
+ AC --> AM
61
+ AC --> CH2
62
+ AC --> LOGS
63
+ AC --> MON
64
+ AC --> EX
65
+ AC --> APIM
66
+ AC --> DC
67
+ CLI --> GUARD
68
+
69
+ OAUTH -->|"callback :3000/api/callback"| AP["Anypoint Platform API"]
70
+ HTTP --> AP
71
+
72
+ style Entry fill:#1a1a2e,stroke:#4ecdc4,color:#e0e0e0
73
+ style Core fill:#16213e,stroke:#0f3460,color:#e0e0e0
74
+ style Auth fill:#1a1a2e,stroke:#e94560,color:#e0e0e0
75
+ style APIs fill:#16213e,stroke:#533483,color:#e0e0e0
76
+ style Safety fill:#1a1a2e,stroke:#ff6b6b,color:#e0e0e0
77
+ style AP fill:#0f3460,stroke:#4ecdc4,color:#e0e0e0
78
+ ```
79
+
80
+ ```
81
+ src/
82
+ ├── auth/ OAuth2 + encrypted token storage
83
+ │ ├── OAuthFlow.ts Browser callback at /api/callback
84
+ │ ├── TokenManager.ts Auto-refresh with 5-min buffer
85
+ │ ├── FileStore.ts AES-256-GCM encrypted tokens
86
+ │ └── TokenStore.ts Storage interface
87
+ ├── client/ HTTP + facade
88
+ │ ├── AnypointClient.ts Main facade (single entry point)
89
+ │ ├── HttpClient.ts Axios with Bearer injection
90
+ │ ├── RateLimiter.ts Token bucket throttling
91
+ │ └── Cache.ts TTL in-memory cache
92
+ ├── api/ Domain API clients
93
+ │ ├── CloudHub2Api.ts Deploy, redeploy, restart, scale, poll
94
+ │ ├── LogsApi.ts Tail, download (CH2 native)
95
+ │ ├── MonitoringApi.ts AMQL queries, JSON/CSV export
96
+ │ ├── ExchangeApi.ts Search assets, download specs
97
+ │ ├── ApiManagerApi.ts API instances, policies, SLA tiers
98
+ │ ├── DesignCenterApi.ts Projects, files, lock/save, publish
99
+ │ └── AccessManagementApi.ts
100
+ ├── commands/ CLI commands
101
+ │ ├── config.ts init | show | set | path
102
+ │ ├── auth.ts login | logout | status
103
+ │ ├── apps.ts list | status | restart | scale
104
+ │ ├── deploy.ts deploy with prod safety net
105
+ │ ├── logs.ts tail | download
106
+ │ ├── monitor.ts view | download
107
+ │ ├── exchange.ts search | info | download-spec
108
+ │ ├── api.ts list | policies | sla-tiers
109
+ │ └── design-center.ts list | files | pull | push | publish
110
+ ├── safety/ Production guards
111
+ │ └── guards.ts Env detection, JAR validation, confirmation
112
+ ├── utils/
113
+ │ └── config.ts 3-layer config resolution
114
+ ├── cli.ts CLI entry point (bin: anc)
115
+ ├── mcp.ts MCP server entry point
116
+ └── index.ts Library barrel export
117
+ ```
118
+
119
+ ### Config Resolution
120
+
121
+ Credentials and settings are resolved via a 3-layer priority chain:
122
+
123
+ ```mermaid
124
+ flowchart LR
125
+ ENV["① Environment Variables<br/><code>ANYPOINT_CLIENT_ID</code>"] --> RESOLVE["Config Resolver"]
126
+ GLOBAL["② Global Config<br/><code>~/.anypoint-connect/config.json</code>"] --> RESOLVE
127
+ LOCAL["③ Project .env<br/><code>cwd/.env</code>"] --> RESOLVE
128
+ RESOLVE --> RUNTIME["Runtime Config"]
129
+
130
+ style ENV fill:#0f3460,stroke:#4ecdc4,color:#e0e0e0
131
+ style GLOBAL fill:#16213e,stroke:#e94560,color:#e0e0e0
132
+ style LOCAL fill:#1a1a2e,stroke:#533483,color:#e0e0e0
133
+ style RESOLVE fill:#1a1a2e,stroke:#4ecdc4,color:#e0e0e0
134
+ style RUNTIME fill:#0f3460,stroke:#4ecdc4,color:#e0e0e0
135
+ ```
136
+
137
+ | Priority | Source | When to use |
138
+ |----------|--------|-------------|
139
+ | **1 (highest)** | Environment variables | CI/CD pipelines, Docker, per-session overrides |
140
+ | **2** | `~/.anypoint-connect/config.json` | Day-to-day development — persists globally |
141
+ | **3 (lowest)** | `.env` in current directory | Legacy/project-local fallback |
142
+
143
+ Everything lives under `~/.anypoint-connect/`:
144
+
145
+ ```
146
+ ~/.anypoint-connect/
147
+ ├── config.json OAuth credentials + settings (chmod 600)
148
+ └── tokens.enc AES-256-GCM encrypted access/refresh tokens
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Setup
154
+
155
+ ### 1. Install
156
+
157
+ ```bash
158
+ # Global install (recommended)
159
+ npm install -g @sfdxy/anypoint-connect
160
+
161
+ # Or from source
162
+ git clone https://github.com/Avinava/anypoint-connect.git
163
+ cd anypoint-connect
164
+ npm install && npm run build
165
+ npm link # makes "anc" available globally
166
+ ```
167
+
168
+ ### 2. Create a Connected App in Anypoint Platform
169
+
170
+ 1. Log in to [Anypoint Platform](https://anypoint.mulesoft.com)
171
+ 2. Go to **Access Management → Connected Apps**
172
+ 3. Click **Create app**, choose **App that acts on a user's behalf**
173
+ 4. Set the **Redirect URI** to `http://localhost:3000/api/callback`
174
+ 5. Grant scopes:
175
+ - `General` → **View Organization**, **View Environment**
176
+ - `Runtime Manager` → **Read Applications**, **Create/Modify Applications**
177
+ - `CloudHub` → **Read Applications**, **Manage Applications**
178
+ - `Monitoring` → **Read Metrics**
179
+ - `Design Center` → **Read/Write Designer**
180
+ - `Exchange` → **Exchange Contributor**
181
+ 6. Copy the **Client ID** and **Client Secret**
182
+
183
+ ### 3. Configure
184
+
185
+ ```bash
186
+ anc config init
187
+ # Client ID: <paste>
188
+ # Client Secret: <paste>
189
+ # Callback URL: (http://localhost:3000/api/callback)
190
+ # Base URL: (https://anypoint.mulesoft.com)
191
+ # Default Environment (optional): Sandbox
192
+ # ✔ Configuration saved!
193
+ ```
194
+
195
+ ### 4. Authenticate
196
+
197
+ ```bash
198
+ anc auth login # Opens browser → OAuth consent → tokens stored
199
+ anc auth status # Verify
200
+ ```
201
+
202
+ ### Managing Config
203
+
204
+ ```bash
205
+ anc config show # Show config (secrets masked)
206
+ anc config set defaultEnv Production # Update a value
207
+ anc config path # Print config directory path
208
+
209
+ # Override per-session
210
+ ANYPOINT_CLIENT_ID=other-id anc apps list --env Sandbox
211
+ ```
212
+
213
+ ---
214
+
215
+ ## CLI Reference
216
+
217
+ ### Applications
218
+
219
+ ```bash
220
+ anc apps list --env Sandbox
221
+ anc apps status my-api --env Sandbox
222
+ anc apps restart my-api --env Production # prod confirmation prompt
223
+ anc apps scale my-api --env Sandbox --replicas 2
224
+ anc apps scale my-api --env Production --replicas 3 --force # skip confirmation
225
+ ```
226
+
227
+ ### Deploy
228
+
229
+ ```bash
230
+ # Standard deploy
231
+ anc deploy target/my-api-1.2.0-mule-application.jar \
232
+ --app my-api --env Sandbox --runtime 4.8.0
233
+
234
+ # Production deploy — triggers safety confirmation
235
+ anc deploy target/my-api.jar --app my-api --env Production
236
+ # ⚠️ PRODUCTION DEPLOYMENT
237
+ # App: my-api
238
+ # Environment: Production
239
+ # Current: v1.1.0 (APPLIED, 2 replicas)
240
+ # New Version: v1.2.0
241
+ # Type 'deploy to production' to confirm: _
242
+
243
+ # CI/CD (skip confirmation)
244
+ anc deploy app.jar --app my-api --env Production --force
245
+ ```
246
+
247
+ ### Logs
248
+
249
+ ```bash
250
+ # Stream logs in real-time
251
+ anc logs tail my-api --env Sandbox
252
+ anc logs tail my-api --env Sandbox --level ERROR --search "NullPointerException"
253
+
254
+ # Download logs
255
+ anc logs download my-api --env Sandbox --from 24h
256
+ anc logs download my-api --env Production --from 7d --level ERROR
257
+ anc logs download my-api --env Production \
258
+ --from "2026-02-01T00:00:00Z" --to "2026-02-14T00:00:00Z" --output prod-logs.log
259
+ ```
260
+
261
+ ### Monitoring
262
+
263
+ ```bash
264
+ # View metrics table (default: last 24h)
265
+ anc monitor view --env Sandbox
266
+ anc monitor view --env Production --app my-api --from 7d
267
+
268
+ # Export
269
+ anc monitor download --env Production --from 30d --format json
270
+ anc monitor download --env Sandbox --from 7d --format csv --output metrics.csv
271
+ ```
272
+
273
+ ### Exchange
274
+
275
+ ```bash
276
+ anc exchange search "order" --type rest-api --limit 10
277
+ anc exchange info my-api-spec
278
+ anc exchange info org-id/my-api-spec --version 1.2.0
279
+ anc exchange download-spec my-api-spec -o spec.json
280
+ ```
281
+
282
+ ### API Manager
283
+
284
+ ```bash
285
+ anc api list --env Production
286
+ anc api policies "order-api" --env Production
287
+ anc api policies 18888853 --env Production
288
+ anc api sla-tiers "order-api" --env Production
289
+ ```
290
+
291
+ ### Design Center
292
+
293
+ ```bash
294
+ # List projects & files
295
+ anc dc list
296
+ anc dc files my-api-spec --branch develop
297
+
298
+ # Pull a spec file (auto-decodes JSON-encoded content)
299
+ anc dc pull my-api-spec api.raml -o local-spec.raml
300
+
301
+ # Push (smart path resolution: auto-matches local filename to remote)
302
+ anc dc push my-api-spec local-spec.raml --message "Add new endpoint"
303
+
304
+ # Push with explicit remote path
305
+ anc dc push my-api-spec local-spec.raml --path api.raml
306
+
307
+ # Publish to Exchange
308
+ anc dc publish my-api-spec --version 1.2.0 --classifier raml
309
+ anc dc publish my-api-spec --version 2.0.0 --classifier oas3 --api-version v2
310
+ ```
311
+
312
+ ### Authentication
313
+
314
+ ```bash
315
+ anc auth login # Opens browser for OAuth login
316
+ anc auth status # Check current auth
317
+ anc auth logout # Clear stored tokens
318
+ ```
319
+
320
+ ---
321
+
322
+ ## MCP Server
323
+
324
+ The MCP server exposes all Anypoint operations as tools for AI assistants (Claude, Cursor, etc.).
325
+
326
+ ### Prerequisites
327
+
328
+ ```bash
329
+ anc config init # one-time setup
330
+ anc auth login # get tokens
331
+ ```
332
+
333
+ ### Configuration
334
+
335
+ Add to your MCP client config:
336
+
337
+ ```json
338
+ {
339
+ "mcpServers": {
340
+ "anypoint-connect": {
341
+ "command": "node",
342
+ "args": ["/absolute/path/to/anypoint-connect/dist/mcp.js"]
343
+ }
344
+ }
345
+ }
346
+ ```
347
+
348
+ Or if installed globally via npm:
349
+
350
+ ```json
351
+ {
352
+ "mcpServers": {
353
+ "anypoint-connect": {
354
+ "command": "npx",
355
+ "args": ["@sfdxy/anypoint-connect"]
356
+ }
357
+ }
358
+ }
359
+ ```
360
+
361
+ No `env` block needed — the MCP server reads from `~/.anypoint-connect/` automatically.
362
+
363
+ ### MCP Tools
364
+
365
+ | Tool | Description |
366
+ |------|-------------|
367
+ | `whoami` | Get authenticated user & org info |
368
+ | `list_environments` | List all environments in the org |
369
+ | `list_apps` | List deployed apps in an environment |
370
+ | `get_app_status` | Detailed deployment status with replicas |
371
+ | `restart_app` | ⚠️ Rolling restart of an application |
372
+ | `scale_app` | ⚠️ Scale application replicas (1–8) |
373
+ | `get_logs` | Fetch recent log entries |
374
+ | `download_logs` | Download logs for a time range |
375
+ | `get_metrics` | Fetch monitoring metrics (AMQL) |
376
+ | `search_exchange` | Search assets in Exchange |
377
+ | `download_api_spec` | Download RAML/OAS spec from Exchange |
378
+ | `compare_environments` | Side-by-side diff of deployments across environments |
379
+ | `list_api_instances` | List managed API instances with governance info |
380
+ | `get_api_policies` | Get policies and SLA tiers for an API |
381
+ | `list_design_center_projects` | List all API spec projects |
382
+ | `get_design_center_files` | List files in a Design Center project |
383
+ | `read_design_center_file` | Read file content with smart path resolution |
384
+ | `update_design_center_file` | ⚠️ Push updated file (lock/save/unlock) |
385
+ | `publish_to_exchange` | ⚠️ Publish Design Center project to Exchange |
386
+
387
+ ### MCP Prompts
388
+
389
+ | Prompt | Description |
390
+ |--------|-------------|
391
+ | `pre-deploy-check` | Readiness check before promoting an app between environments |
392
+ | `troubleshoot-app` | Systematic diagnosis: replica health, error patterns, metrics anomalies |
393
+ | `api-governance-audit` | Review policies, SLA tiers, and security gaps across all APIs |
394
+ | `environment-overview` | Full health report: app status, error rates, performance rankings |
395
+ | `improve-api-spec` | Guided pull→analyze→improve→push workflow for API spec quality |
396
+
397
+ ### MCP Resource
398
+
399
+ | Resource | URI |
400
+ |----------|-----|
401
+ | Environments | `anypoint://environments` |
402
+
403
+ ### Example Interactions
404
+
405
+ - *"What apps are running in Sandbox?"*
406
+ - *"Show me the last 50 error logs for my-api in Production"*
407
+ - *"Compare Development and Production environments"*
408
+ - *"What policies are applied to the Order API?"*
409
+ - *"Show me the RAML spec for the order-api project"*
410
+ - *"Improve the API descriptions for order-api"*
411
+ - *"Scale order-service to 3 replicas in Production"*
412
+
413
+ ---
414
+
415
+ ## Programmatic Usage
416
+
417
+ ```typescript
418
+ import { AnypointClient } from '@sfdxy/anypoint-connect';
419
+
420
+ const client = new AnypointClient({
421
+ clientId: process.env.ANYPOINT_CLIENT_ID!,
422
+ clientSecret: process.env.ANYPOINT_CLIENT_SECRET!,
423
+ });
424
+
425
+ // Get user info
426
+ const me = await client.whoami();
427
+ console.log(me.organization.name);
428
+
429
+ // List environments
430
+ const orgId = me.organization.id;
431
+ const envs = await client.accessManagement.getEnvironments(orgId);
432
+
433
+ // List apps in sandbox
434
+ const sandbox = envs.find(e => e.name === 'Sandbox')!;
435
+ const apps = await client.cloudHub2.getDeployments(orgId, sandbox.id);
436
+
437
+ // Tail logs
438
+ for await (const entries of client.logs.tailLogs(orgId, sandbox.id, 'my-api')) {
439
+ entries.forEach(e => console.log(`[${e.priority}] ${e.message}`));
440
+ }
441
+
442
+ // Get metrics
443
+ const metrics = await client.monitoring.getAppMetrics(
444
+ orgId, sandbox.id,
445
+ Date.now() - 24 * 60 * 60 * 1000,
446
+ Date.now()
447
+ );
448
+
449
+ // Design Center: pull, edit, push
450
+ const projects = await client.designCenter.getProjects(orgId);
451
+ const spec = await client.designCenter.getFileContent(orgId, projects[0].id, 'api.raml');
452
+ await client.designCenter.updateFile(orgId, projects[0].id, 'api.raml', updatedContent);
453
+ await client.designCenter.publishToExchange(orgId, projects[0].id, {
454
+ name: 'My API', apiVersion: 'v1', version: '1.0.0', classifier: 'raml'
455
+ });
456
+ ```
457
+
458
+ ---
459
+
460
+ ## Release Process
461
+
462
+ Releases are automated via GitHub Actions:
463
+
464
+ ```bash
465
+ # 1. Bump version in package.json
466
+ npm version patch # or minor / major
467
+
468
+ # 2. Push the tag
469
+ git push --follow-tags
470
+
471
+ # 3. GitHub Actions will:
472
+ # - Run CI (build, test, lint)
473
+ # - Publish to npm as @sfdxy/anypoint-connect
474
+ # - Create a GitHub Release with auto-generated notes
475
+ ```
476
+
477
+ ---
478
+
479
+ ## License
480
+
481
+ MIT
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Access Management API
3
+ * User profile and environment management
4
+ */
5
+ import type { HttpClient } from '../client/HttpClient.js';
6
+ import type { Cache } from '../client/Cache.js';
7
+ export interface UserProfile {
8
+ id: string;
9
+ username: string;
10
+ firstName: string;
11
+ lastName: string;
12
+ email: string;
13
+ organization: {
14
+ id: string;
15
+ name: string;
16
+ domain: string;
17
+ };
18
+ memberOfOrganizations?: Array<{
19
+ id: string;
20
+ name: string;
21
+ }>;
22
+ }
23
+ export interface Environment {
24
+ id: string;
25
+ name: string;
26
+ organizationId: string;
27
+ type: string;
28
+ isProduction: boolean;
29
+ clientId?: string;
30
+ }
31
+ export declare class AccessManagementApi {
32
+ private readonly http;
33
+ private readonly cache;
34
+ constructor(http: HttpClient, cache: Cache);
35
+ getMe(): Promise<UserProfile>;
36
+ getEnvironments(orgId: string): Promise<Environment[]>;
37
+ /**
38
+ * Resolve environment name to ID
39
+ */
40
+ resolveEnvironment(orgId: string, nameOrId: string): Promise<Environment>;
41
+ }
42
+ //# sourceMappingURL=AccessManagementApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessManagementApi.d.ts","sourceRoot":"","sources":["../../src/api/AccessManagementApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,qBAAqB,CAAC,EAAE,KAAK,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACN;AAWD,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,mBAAmB;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,KAAK;IAG3B,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IAoB7B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAS5D;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAWlF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Access Management API
3
+ * User profile and environment management
4
+ */
5
+ export class AccessManagementApi {
6
+ http;
7
+ cache;
8
+ constructor(http, cache) {
9
+ this.http = http;
10
+ this.cache = cache;
11
+ }
12
+ async getMe() {
13
+ return this.cache.getOrCompute('me', async () => {
14
+ const raw = await this.http.get('/accounts/api/me');
15
+ // /accounts/api/me returns { user: {...}, organization: {...} }
16
+ const user = raw.user ?? raw;
17
+ const org = raw.organization ?? user.organization;
18
+ return {
19
+ id: user.id,
20
+ username: user.username,
21
+ firstName: user.firstName,
22
+ lastName: user.lastName,
23
+ email: user.email,
24
+ organization: org ?? { id: '', name: 'Unknown', domain: '' },
25
+ memberOfOrganizations: user.memberOfOrganizations,
26
+ };
27
+ });
28
+ }
29
+ async getEnvironments(orgId) {
30
+ return this.cache.getOrCompute(`envs:${orgId}`, async () => {
31
+ const response = await this.http.get(`/accounts/api/organizations/${orgId}/environments`);
32
+ return response.data || [];
33
+ });
34
+ }
35
+ /**
36
+ * Resolve environment name to ID
37
+ */
38
+ async resolveEnvironment(orgId, nameOrId) {
39
+ const envs = await this.getEnvironments(orgId);
40
+ const env = envs.find((e) => e.id === nameOrId || e.name.toLowerCase() === nameOrId.toLowerCase());
41
+ if (!env) {
42
+ const available = envs.map((e) => e.name).join(', ');
43
+ throw new Error(`Environment "${nameOrId}" not found. Available: ${available}`);
44
+ }
45
+ return env;
46
+ }
47
+ }
48
+ //# sourceMappingURL=AccessManagementApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessManagementApi.js","sourceRoot":"","sources":["../../src/api/AccessManagementApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwCH,MAAM,OAAO,mBAAmB;IAEP;IACA;IAFrB,YACqB,IAAgB,EAChB,KAAY;QADZ,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAO;IAC9B,CAAC;IAEJ,KAAK,CAAC,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,kBAAkB,CAAC,CAAC;YAEnE,gEAAgE;YAChE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAK,GAA8B,CAAC;YACzD,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,IAAK,IAAY,CAAC,YAAY,CAAC;YAE3D,OAAO;gBACH,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,YAAY,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC5D,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;aACpD,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAChC,+BAA+B,KAAK,eAAe,CACtD,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAa,EAAE,QAAgB;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAEnG,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,2BAA2B,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * API Manager API
3
+ * Manages API instances, policies, SLA tiers, and alerts
4
+ */
5
+ import type { HttpClient } from '../client/HttpClient.js';
6
+ import type { Cache } from '../client/Cache.js';
7
+ export interface ApiInstance {
8
+ id: number;
9
+ instanceLabel?: string;
10
+ groupId: string;
11
+ assetId: string;
12
+ assetVersion: string;
13
+ productVersion?: string;
14
+ description?: string;
15
+ tags?: string[];
16
+ status: string;
17
+ endpointUri?: string;
18
+ technology?: string;
19
+ deprecated?: boolean;
20
+ isPublic?: boolean;
21
+ stage?: string;
22
+ activeContractsCount?: number;
23
+ autodiscoveryInstanceName?: string;
24
+ }
25
+ export interface ApiAsset {
26
+ id: number;
27
+ name: string;
28
+ exchangeAssetName: string;
29
+ groupId: string;
30
+ assetId: string;
31
+ apis: ApiInstance[];
32
+ totalApis: number;
33
+ }
34
+ export interface ApiPolicy {
35
+ id?: number;
36
+ policyTemplateId?: string;
37
+ configurationData?: Record<string, unknown>;
38
+ pointcutData?: Record<string, unknown>;
39
+ order?: number;
40
+ disabled?: boolean;
41
+ template?: {
42
+ groupId?: string;
43
+ assetId?: string;
44
+ assetVersion?: string;
45
+ };
46
+ }
47
+ export interface SlaTier {
48
+ id: number;
49
+ name: string;
50
+ description?: string;
51
+ status: string;
52
+ autoApprove: boolean;
53
+ applicationCount: number;
54
+ limits: Array<{
55
+ maximumRequests: number;
56
+ timePeriodInMilliseconds: number;
57
+ }>;
58
+ }
59
+ export declare class ApiManagerApi {
60
+ private readonly http;
61
+ private readonly cache;
62
+ constructor(http: HttpClient, cache: Cache);
63
+ /**
64
+ * List all API assets/instances in an environment
65
+ */
66
+ getApis(orgId: string, envId: string): Promise<ApiAsset[]>;
67
+ /**
68
+ * Get policies for an API instance
69
+ */
70
+ getPolicies(orgId: string, envId: string, apiId: number): Promise<ApiPolicy[]>;
71
+ /**
72
+ * Get SLA tiers for an API instance
73
+ */
74
+ getSlaTiers(orgId: string, envId: string, apiId: number): Promise<SlaTier[]>;
75
+ /**
76
+ * Get alerts for an API instance
77
+ */
78
+ getAlerts(orgId: string, envId: string, apiId: number): Promise<unknown[]>;
79
+ /**
80
+ * Find an API instance by name
81
+ */
82
+ findByName(orgId: string, envId: string, name: string): Promise<{
83
+ asset: ApiAsset;
84
+ instance: ApiInstance;
85
+ } | null>;
86
+ }
87
+ //# sourceMappingURL=ApiManagerApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiManagerApi.d.ts","sourceRoot":"","sources":["../../src/api/ApiManagerApi.ts"],"names":[],"mappings":"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"}