0nmcp 2.9.2 → 3.0.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.
package/README.md CHANGED
@@ -2,20 +2,22 @@
2
2
 
3
3
  # 0nMCP
4
4
 
5
- ### 945 Tools. 54 Services. One MCP Server.
5
+ ### 995+ Tools. 55 Services. One MCP Server.
6
6
 
7
7
  **The most comprehensive MCP server available.**<br>
8
- Connect any AI to any API. Natural language. Zero configuration. $0.01/run.
8
+ Connect any AI to any API. Natural language. Zero configuration. $0.01/run.<br>
9
+ 4 patents filed. LinkedIn certifications. Daily patent monitoring via 0nDefender.
9
10
 
10
11
  [![npm version](https://img.shields.io/npm/v/0nmcp.svg?style=flat-square)](https://www.npmjs.com/package/0nmcp)
11
12
  [![npm downloads](https://img.shields.io/npm/dm/0nmcp.svg?style=flat-square)](https://www.npmjs.com/package/0nmcp)
12
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
13
14
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen?style=flat-square)](https://nodejs.org)
14
15
  [![MCP](https://img.shields.io/badge/MCP-Compatible-blueviolet?style=flat-square)](https://modelcontextprotocol.io)
15
- [![Tools](https://img.shields.io/badge/tools-945-orange?style=flat-square)](#tool-count-breakdown)
16
- [![Services](https://img.shields.io/badge/services-54-blue?style=flat-square)](#all-54-services)
16
+ [![Tools](https://img.shields.io/badge/tools-995+-orange?style=flat-square)](#tool-count-breakdown)
17
+ [![Services](https://img.shields.io/badge/services-55-blue?style=flat-square)](#all-55-services)
18
+ [![Patents](https://img.shields.io/badge/patents-4%20filed-blueviolet?style=flat-square)](#key-features)
17
19
 
18
- [Website](https://0nmcp.com) &middot; [Quick Start](#quick-start) &middot; [All 54 Services](#all-54-services) &middot; [MCP Config](#mcp-configuration) &middot; [Community](https://0nmcp.com/community)
20
+ [Website](https://0nmcp.com) &middot; [Quick Start](#quick-start) &middot; [All 55 Services](#all-55-services) &middot; [MCP Config](#mcp-configuration) &middot; [Certifications](https://0nmcp.com/learn) &middot; [Community](https://0nmcp.com/community)
19
21
 
20
22
  </div>
21
23
 
@@ -117,7 +119,7 @@ That's it. Your AI can now use 945 tools across 54 services.
117
119
  | Service | Tools | What You Can Do |
118
120
  |---------|-------|-----------------|
119
121
  | **Mailchimp** | Email Marketing | Campaigns, audiences, automations |
120
- | **LinkedIn** | Social | Posts, profiles, companies |
122
+ | **LinkedIn** | 50 tools | Posts, profiles, org pages, ads, reporting, events, certifications |
121
123
  | **Instagram** | Social | Posts, stories, insights |
122
124
  | **TikTok** | Social | Videos, analytics |
123
125
  | **Twitter/X** | Social | Tweets, timelines, users |
@@ -169,14 +171,14 @@ That's it. Your AI can now use 945 tools across 54 services.
169
171
 
170
172
  | Module | Tools | Description |
171
173
  |--------|-------|-------------|
172
- | **Service Catalog** | 651 | API tools across 54 services |
173
- | **CRM Module** | 294 | Contacts, calendars, pipelines, invoices, payments, social, custom objects |
174
+ | **Service Catalog** | 701 | API tools across 55 services (including LinkedIn 50-tool suite) |
175
+ | **CRM Module** | 245 | Contacts, calendars, pipelines, invoices, payments, social, custom objects |
174
176
  | **0nVault** | 4 | AES-256-GCM machine-bound encryption |
175
177
  | **Vault Containers** | 8 | Patent-pending multi-layer encrypted containers (US #63/990,046) |
176
178
  | **Deed Transfer** | 6 | Digital business asset packaging and transfer |
177
- | **Engine** | 6 | Credential import, verification, AI platform config generation |
179
+ | **Engine** | 29 | Credential import, verification, AI platform config generation |
178
180
  | **App Builder** | 5 | Operations, routes, middleware, scheduler |
179
- | **Total** | **945** | |
181
+ | **Total** | **995+** | |
180
182
 
181
183
  ---
182
184
 
@@ -315,6 +317,51 @@ Credentials are stored in `~/.0n/connections/` and workflows in `~/.0n/workflows
315
317
 
316
318
  ---
317
319
 
320
+ ## LinkedIn Integration (50 tools)
321
+
322
+ Full LinkedIn API v2 suite with 17 OAuth scopes:
323
+
324
+ | Category | Endpoints | Capabilities |
325
+ |----------|-----------|-------------|
326
+ | **Profile** | 5 | Basic info, email, connections, verification, photos |
327
+ | **Social** | 10 | Posts CRUD, comments, likes, shares, image/video upload |
328
+ | **Organization** | 10 | Pages, stats, followers, visitors, brand pages |
329
+ | **Advertising** | 15 | Accounts, campaigns, creatives, targeting, lead forms |
330
+ | **Ad Reporting** | 5 | Analytics, conversions, budgets, InMail stats |
331
+ | **Events** | 5 | Create, manage, attendees |
332
+
333
+ ---
334
+
335
+ ## 0nMCP Certifications
336
+
337
+ Complete courses and earn LinkedIn-verifiable certifications:
338
+
339
+ | Certification | Course | Level |
340
+ |--------------|--------|-------|
341
+ | **0nMCP Certified Orchestrator** | 0nMCP Mastery | Getting Started |
342
+ | **CRM Automation Specialist** | CRM Automation Blueprint | Intermediate |
343
+ | **Security Engineer** | 0nVault Security | Advanced |
344
+ | **AI Council Architect** | 0nPlex Council | Advanced |
345
+ | **Enterprise Deployer** | Enterprise Deployment | Enterprise |
346
+ | **Certified Developer** | .0n SWITCH Files | Fundamentals |
347
+
348
+ Add certifications to your LinkedIn profile with one click. Public verification at `0nmcp.com/verify/{certId}`.
349
+
350
+ ---
351
+
352
+ ## 0nDefender (Patent Intelligence)
353
+
354
+ Always-on competitive intelligence that monitors four threat vectors daily:
355
+
356
+ - **MCP Ecosystem Entrants** — new companies building on MCP
357
+ - **Patent Conflicts** — USPTO/WIPO filings overlapping our 4 patents
358
+ - **Acquisition Signals** — companies that might license or acquire
359
+ - **Brand Protection** — unauthorized use of 0nMCP IP
360
+
361
+ Automated daily scans via Claude AI with web search. Dashboard at `/admin/patent-intel`.
362
+
363
+ ---
364
+
318
365
  ## Links
319
366
 
320
367
  - **Website**: [0nmcp.com](https://0nmcp.com)
@@ -323,6 +370,8 @@ Credentials are stored in `~/.0n/connections/` and workflows in `~/.0n/workflows
323
370
  - **Community**: [0nmcp.com/community](https://0nmcp.com/community)
324
371
  - **Forum**: [0nmcp.com/forum](https://0nmcp.com/forum)
325
372
  - **Marketplace**: [marketplace.rocketclients.com](https://marketplace.rocketclients.com)
373
+ - **Learn & Certify**: [0nmcp.com/learn](https://0nmcp.com/learn)
374
+ - **Community Grid**: [grid.0nmcp.com](https://grid.0nmcp.com)
326
375
 
327
376
  ---
328
377
 
package/catalog.js CHANGED
@@ -255,20 +255,82 @@ export const SERVICE_CATALOG = {
255
255
  slack: {
256
256
  name: "Slack",
257
257
  type: "communication",
258
- description: "Team messaging — channels, direct messages, notifications",
258
+ description: "Team messaging — channels, messages, threads, users, files, reactions, bookmarks, reminders, canvases, search, scheduled messages, pins",
259
259
  baseUrl: "https://slack.com/api",
260
+ mcpServer: "https://mcp.slack.com/mcp",
260
261
  authType: "bot_token",
261
262
  credentialKeys: ["botToken"],
262
263
  capabilities: [
263
- { name: "send_message", actions: ["send"], description: "Post messages to channels" },
264
- { name: "manage_channels", actions: ["list", "create"], description: "List and create channels" },
265
- { name: "manage_users", actions: ["list"], description: "List workspace users" },
266
- ],
267
- endpoints: {
268
- send_message: { method: "POST", path: "/chat.postMessage", body: { channel: "", text: "" } },
269
- list_channels: { method: "GET", path: "/conversations.list" },
270
- list_users: { method: "GET", path: "/users.list" },
271
- create_channel: { method: "POST", path: "/conversations.create", body: { name: "" } },
264
+ { name: "send_message", actions: ["send", "update", "delete", "schedule"], description: "Post, update, delete, and schedule messages" },
265
+ { name: "manage_channels", actions: ["list", "create", "archive", "rename", "set_topic", "set_purpose", "invite", "kick"], description: "Full channel lifecycle management" },
266
+ { name: "manage_threads", actions: ["reply", "list_replies"], description: "Thread replies and conversation management" },
267
+ { name: "manage_users", actions: ["list", "get", "set_status"], description: "List users, get profiles, set status" },
268
+ { name: "manage_files", actions: ["upload", "list", "delete", "share"], description: "Upload, list, delete, and share files" },
269
+ { name: "manage_reactions", actions: ["add", "remove", "list"], description: "Emoji reactions on messages" },
270
+ { name: "manage_pins", actions: ["add", "remove", "list"], description: "Pin and unpin messages in channels" },
271
+ { name: "manage_bookmarks", actions: ["add", "remove", "list"], description: "Channel bookmarks" },
272
+ { name: "manage_reminders", actions: ["add", "list", "delete"], description: "Set and manage reminders" },
273
+ { name: "search", actions: ["messages", "files", "users"], description: "Search across messages, files, and users" },
274
+ { name: "manage_canvases", actions: ["create", "update", "read"], description: "Create and edit Slack canvases" },
275
+ ],
276
+ endpoints: {
277
+ // Messages
278
+ send_message: { method: "POST", path: "/chat.postMessage", body: { channel: "", text: "" } },
279
+ update_message: { method: "POST", path: "/chat.update", body: { channel: "", ts: "", text: "" } },
280
+ delete_message: { method: "POST", path: "/chat.delete", body: { channel: "", ts: "" } },
281
+ schedule_message: { method: "POST", path: "/chat.scheduleMessage", body: { channel: "", text: "", post_at: 0 } },
282
+ get_permalink: { method: "GET", path: "/chat.getPermalink", query: ["channel", "message_ts"] },
283
+ // Threads
284
+ reply_to_thread: { method: "POST", path: "/chat.postMessage", body: { channel: "", thread_ts: "", text: "" } },
285
+ get_thread_replies: { method: "GET", path: "/conversations.replies", query: ["channel", "ts"] },
286
+ // Channels
287
+ list_channels: { method: "GET", path: "/conversations.list", query: ["types", "limit", "cursor"] },
288
+ create_channel: { method: "POST", path: "/conversations.create", body: { name: "" } },
289
+ archive_channel: { method: "POST", path: "/conversations.archive", body: { channel: "" } },
290
+ unarchive_channel: { method: "POST", path: "/conversations.unarchive", body: { channel: "" } },
291
+ rename_channel: { method: "POST", path: "/conversations.rename", body: { channel: "", name: "" } },
292
+ set_channel_topic: { method: "POST", path: "/conversations.setTopic", body: { channel: "", topic: "" } },
293
+ set_channel_purpose: { method: "POST", path: "/conversations.setPurpose", body: { channel: "", purpose: "" } },
294
+ invite_to_channel: { method: "POST", path: "/conversations.invite", body: { channel: "", users: "" } },
295
+ kick_from_channel: { method: "POST", path: "/conversations.kick", body: { channel: "", user: "" } },
296
+ channel_history: { method: "GET", path: "/conversations.history", query: ["channel", "limit", "oldest", "latest"] },
297
+ channel_info: { method: "GET", path: "/conversations.info", query: ["channel"] },
298
+ join_channel: { method: "POST", path: "/conversations.join", body: { channel: "" } },
299
+ leave_channel: { method: "POST", path: "/conversations.leave", body: { channel: "" } },
300
+ // Users
301
+ list_users: { method: "GET", path: "/users.list", query: ["limit", "cursor"] },
302
+ get_user: { method: "GET", path: "/users.info", query: ["user"] },
303
+ get_user_profile: { method: "GET", path: "/users.profile.get", query: ["user"] },
304
+ set_user_status: { method: "POST", path: "/users.profile.set", body: { profile: { status_text: "", status_emoji: "" } } },
305
+ // Files
306
+ upload_file: { method: "POST", path: "/files.upload", body: { channels: "", filename: "", content: "" } },
307
+ list_files: { method: "GET", path: "/files.list", query: ["channel", "types", "count"] },
308
+ delete_file: { method: "POST", path: "/files.delete", body: { file: "" } },
309
+ share_file: { method: "POST", path: "/files.sharedPublicURL", body: { file: "" } },
310
+ // Reactions
311
+ add_reaction: { method: "POST", path: "/reactions.add", body: { channel: "", timestamp: "", name: "" } },
312
+ remove_reaction: { method: "POST", path: "/reactions.remove", body: { channel: "", timestamp: "", name: "" } },
313
+ list_reactions: { method: "GET", path: "/reactions.get", query: ["channel", "timestamp"] },
314
+ // Pins
315
+ pin_message: { method: "POST", path: "/pins.add", body: { channel: "", timestamp: "" } },
316
+ unpin_message: { method: "POST", path: "/pins.remove", body: { channel: "", timestamp: "" } },
317
+ list_pins: { method: "GET", path: "/pins.list", query: ["channel"] },
318
+ // Bookmarks
319
+ add_bookmark: { method: "POST", path: "/bookmarks.add", body: { channel_id: "", title: "", type: "link", link: "" } },
320
+ remove_bookmark: { method: "POST", path: "/bookmarks.remove", body: { bookmark_id: "", channel_id: "" } },
321
+ list_bookmarks: { method: "GET", path: "/bookmarks.list", query: ["channel_id"] },
322
+ // Reminders
323
+ add_reminder: { method: "POST", path: "/reminders.add", body: { text: "", time: "" } },
324
+ list_reminders: { method: "GET", path: "/reminders.list" },
325
+ delete_reminder: { method: "POST", path: "/reminders.delete", body: { reminder: "" } },
326
+ // Search
327
+ search_messages: { method: "GET", path: "/search.messages", query: ["query", "count", "sort", "sort_dir"] },
328
+ search_files: { method: "GET", path: "/search.files", query: ["query", "count"] },
329
+ // Canvases
330
+ create_canvas: { method: "POST", path: "/canvases.create", body: { title: "", document_content: { type: "markdown", markdown: "" } } },
331
+ update_canvas: { method: "POST", path: "/canvases.edit", body: { canvas_id: "", changes: [] } },
332
+ // Team info
333
+ get_team_info: { method: "GET", path: "/team.info" },
272
334
  },
273
335
  authHeader: (creds) => ({
274
336
  "Authorization": `Bearer ${creds.botToken}`,
@@ -1244,35 +1306,94 @@ export const SERVICE_CATALOG = {
1244
1306
  square: {
1245
1307
  name: "Square",
1246
1308
  type: "payments",
1247
- description: "Payments and commerce payments, customers, orders, catalog, inventory",
1309
+ description: "Payments, commerce, POS, invoices, subscriptions, loyalty, gift cards, bookings, team, locations — full Square ecosystem",
1248
1310
  baseUrl: "https://connect.squareup.com/v2",
1249
1311
  authType: "access_token",
1250
1312
  credentialKeys: ["accessToken"],
1251
1313
  capabilities: [
1252
- { name: "manage_payments", actions: ["create", "list", "get", "refund"], description: "Process and manage payments" },
1253
- { name: "manage_customers", actions: ["create", "list", "get", "update", "delete"], description: "Manage customer directory" },
1254
- { name: "manage_orders", actions: ["create", "list", "get"], description: "Create and manage orders" },
1255
- { name: "manage_catalog", actions: ["create", "list", "search"], description: "Manage product catalog" },
1256
- { name: "manage_inventory", actions: ["get", "adjust"], description: "Track and adjust inventory" },
1257
- ],
1258
- endpoints: {
1314
+ { name: "manage_payments", actions: ["create", "list", "get", "refund", "complete"], description: "Process payments, refunds, and completions" },
1315
+ { name: "manage_customers", actions: ["create", "list", "get", "update", "delete", "search"], description: "Full customer directory management" },
1316
+ { name: "manage_orders", actions: ["create", "list", "get", "update", "pay"], description: "Create, manage, and pay orders" },
1317
+ { name: "manage_catalog", actions: ["create", "list", "search", "update", "delete"], description: "Product catalog lifecycle" },
1318
+ { name: "manage_inventory", actions: ["get", "adjust", "transfer"], description: "Inventory tracking and transfers" },
1319
+ { name: "manage_invoices", actions: ["create", "list", "get", "update", "publish", "cancel"], description: "Create and send invoices" },
1320
+ { name: "manage_subscriptions", actions: ["create", "list", "get", "update", "cancel"], description: "Recurring billing subscriptions" },
1321
+ { name: "manage_loyalty", actions: ["create_account", "list_accounts", "accumulate", "redeem"], description: "Loyalty program management" },
1322
+ { name: "manage_gift_cards", actions: ["create", "list", "get", "link", "unlink"], description: "Gift card operations" },
1323
+ { name: "manage_bookings", actions: ["create", "list", "get", "update", "cancel"], description: "Appointment scheduling" },
1324
+ { name: "manage_team", actions: ["create", "list", "get", "update"], description: "Team member management" },
1325
+ { name: "manage_locations", actions: ["list", "get", "create", "update"], description: "Multi-location management" },
1326
+ ],
1327
+ endpoints: {
1328
+ // Payments
1259
1329
  create_payment: { method: "POST", path: "/payments", body: { source_id: "", idempotency_key: "", amount_money: { amount: 0, currency: "USD" } } },
1260
1330
  list_payments: { method: "GET", path: "/payments", query: ["begin_time", "end_time", "sort_order", "cursor", "limit"] },
1261
1331
  get_payment: { method: "GET", path: "/payments/{paymentId}" },
1332
+ complete_payment: { method: "POST", path: "/payments/{paymentId}/complete" },
1262
1333
  create_refund: { method: "POST", path: "/refunds", body: { idempotency_key: "", payment_id: "", amount_money: {} } },
1334
+ list_refunds: { method: "GET", path: "/refunds", query: ["begin_time", "end_time", "cursor", "limit"] },
1335
+ // Customers
1263
1336
  create_customer: { method: "POST", path: "/customers", body: { given_name: "", family_name: "", email_address: "" } },
1264
1337
  list_customers: { method: "GET", path: "/customers", query: ["cursor", "limit", "sort_field", "sort_order"] },
1265
1338
  get_customer: { method: "GET", path: "/customers/{customerId}" },
1266
1339
  update_customer: { method: "PUT", path: "/customers/{customerId}", body: {} },
1267
1340
  delete_customer: { method: "DELETE", path: "/customers/{customerId}" },
1341
+ search_customers: { method: "POST", path: "/customers/search", body: { query: {} } },
1342
+ // Orders
1268
1343
  create_order: { method: "POST", path: "/orders", body: { order: { location_id: "", line_items: [] }, idempotency_key: "" } },
1269
- list_orders: { method: "POST", path: "/orders/search", body: { location_ids: [], query: {} } },
1344
+ search_orders: { method: "POST", path: "/orders/search", body: { location_ids: [], query: {} } },
1270
1345
  get_order: { method: "GET", path: "/orders/{orderId}" },
1346
+ update_order: { method: "PUT", path: "/orders/{orderId}", body: { order: {} } },
1347
+ pay_order: { method: "POST", path: "/orders/{orderId}/pay", body: { idempotency_key: "" } },
1348
+ // Catalog
1271
1349
  create_catalog_object:{ method: "POST", path: "/catalog/object", body: { idempotency_key: "", object: {} } },
1272
1350
  list_catalog: { method: "GET", path: "/catalog/list", query: ["types", "cursor"] },
1273
1351
  search_catalog: { method: "POST", path: "/catalog/search", body: { object_types: [], query: {} } },
1352
+ update_catalog_object:{ method: "POST", path: "/catalog/object", body: { idempotency_key: "", object: {} } },
1353
+ delete_catalog_object:{ method: "DELETE", path: "/catalog/object/{objectId}" },
1354
+ // Inventory
1274
1355
  get_inventory: { method: "POST", path: "/inventory/counts/batch-retrieve", body: { catalog_object_ids: [] } },
1275
1356
  adjust_inventory: { method: "POST", path: "/inventory/changes/batch-create", body: { idempotency_key: "", changes: [] } },
1357
+ transfer_inventory: { method: "POST", path: "/inventory/transfers/batch-create", body: { idempotency_key: "", transfers: [] } },
1358
+ // Invoices
1359
+ create_invoice: { method: "POST", path: "/invoices", body: { invoice: {}, idempotency_key: "" } },
1360
+ list_invoices: { method: "GET", path: "/invoices", query: ["location_id", "cursor", "limit"] },
1361
+ get_invoice: { method: "GET", path: "/invoices/{invoiceId}" },
1362
+ update_invoice: { method: "PUT", path: "/invoices/{invoiceId}", body: { invoice: {} } },
1363
+ publish_invoice: { method: "POST", path: "/invoices/{invoiceId}/publish", body: { version: 0, idempotency_key: "" } },
1364
+ cancel_invoice: { method: "POST", path: "/invoices/{invoiceId}/cancel" },
1365
+ // Subscriptions
1366
+ create_subscription: { method: "POST", path: "/subscriptions", body: { idempotency_key: "", location_id: "", plan_variation_id: "", customer_id: "" } },
1367
+ list_subscriptions: { method: "POST", path: "/subscriptions/search", body: { query: {} } },
1368
+ get_subscription: { method: "GET", path: "/subscriptions/{subscriptionId}" },
1369
+ update_subscription: { method: "PUT", path: "/subscriptions/{subscriptionId}", body: {} },
1370
+ cancel_subscription: { method: "POST", path: "/subscriptions/{subscriptionId}/cancel" },
1371
+ // Loyalty
1372
+ create_loyalty_account: { method: "POST", path: "/loyalty/accounts", body: { account: {}, idempotency_key: "" } },
1373
+ search_loyalty_accounts:{ method: "POST", path: "/loyalty/accounts/search", body: { query: {} } },
1374
+ accumulate_loyalty: { method: "POST", path: "/loyalty/accounts/{accountId}/accumulate", body: { accumulate_points: {}, idempotency_key: "" } },
1375
+ redeem_loyalty: { method: "POST", path: "/loyalty/rewards", body: { reward: {}, idempotency_key: "" } },
1376
+ // Gift Cards
1377
+ create_gift_card: { method: "POST", path: "/gift-cards", body: { idempotency_key: "", location_id: "", type: "DIGITAL" } },
1378
+ list_gift_cards: { method: "GET", path: "/gift-cards", query: ["type", "state", "cursor", "limit"] },
1379
+ get_gift_card: { method: "GET", path: "/gift-cards/{giftCardId}" },
1380
+ link_gift_card: { method: "POST", path: "/gift-cards/{giftCardId}/link-customer", body: { customer_id: "" } },
1381
+ // Bookings
1382
+ create_booking: { method: "POST", path: "/bookings", body: { booking: {}, idempotency_key: "" } },
1383
+ list_bookings: { method: "GET", path: "/bookings", query: ["limit", "cursor", "team_member_id", "location_id", "start_at_min", "start_at_max"] },
1384
+ get_booking: { method: "GET", path: "/bookings/{bookingId}" },
1385
+ update_booking: { method: "PUT", path: "/bookings/{bookingId}", body: { booking: {} } },
1386
+ cancel_booking: { method: "POST", path: "/bookings/{bookingId}/cancel" },
1387
+ // Team
1388
+ create_team_member: { method: "POST", path: "/team-members", body: { idempotency_key: "", team_member: {} } },
1389
+ search_team_members: { method: "POST", path: "/team-members/search", body: { query: {} } },
1390
+ get_team_member: { method: "GET", path: "/team-members/{teamMemberId}" },
1391
+ update_team_member: { method: "PUT", path: "/team-members/{teamMemberId}", body: { team_member: {} } },
1392
+ // Locations
1393
+ list_locations: { method: "GET", path: "/locations" },
1394
+ get_location: { method: "GET", path: "/locations/{locationId}" },
1395
+ create_location: { method: "POST", path: "/locations", body: { location: {} } },
1396
+ update_location: { method: "PUT", path: "/locations/{locationId}", body: { location: {} } },
1276
1397
  },
1277
1398
  authHeader: (creds) => ({
1278
1399
  "Authorization": `Bearer ${creds.accessToken}`,
@@ -1281,6 +1402,85 @@ export const SERVICE_CATALOG = {
1281
1402
  }),
1282
1403
  },
1283
1404
 
1405
+ // ── WooCommerce ──────────────────────────────────────────────
1406
+ woocommerce: {
1407
+ name: "WooCommerce",
1408
+ type: "ecommerce",
1409
+ description: "WordPress e-commerce — products, orders, customers, coupons, categories, reports, shipping, taxes, refunds",
1410
+ baseUrl: "https://{siteUrl}/wp-json/wc/v3",
1411
+ authType: "basic",
1412
+ credentialKeys: ["siteUrl", "consumerKey", "consumerSecret"],
1413
+ capabilities: [
1414
+ { name: "manage_products", actions: ["create", "list", "get", "update", "delete"], description: "Full product lifecycle management" },
1415
+ { name: "manage_orders", actions: ["create", "list", "get", "update", "delete"], description: "Order processing and fulfillment" },
1416
+ { name: "manage_customers", actions: ["create", "list", "get", "update", "delete"], description: "Customer directory" },
1417
+ { name: "manage_coupons", actions: ["create", "list", "get", "update", "delete"], description: "Discount coupon management" },
1418
+ { name: "manage_categories", actions: ["create", "list", "get", "update", "delete"], description: "Product categories" },
1419
+ { name: "manage_shipping", actions: ["list_zones", "list_methods"], description: "Shipping configuration" },
1420
+ { name: "manage_reports", actions: ["sales", "top_sellers", "coupons"], description: "Sales and performance reports" },
1421
+ { name: "manage_refunds", actions: ["create", "list"], description: "Order refunds" },
1422
+ ],
1423
+ endpoints: {
1424
+ // Products
1425
+ create_product: { method: "POST", path: "/products", body: { name: "", type: "simple", regular_price: "" } },
1426
+ list_products: { method: "GET", path: "/products", query: ["per_page", "page", "search", "status", "category", "sku", "orderby", "order"] },
1427
+ get_product: { method: "GET", path: "/products/{productId}" },
1428
+ update_product: { method: "PUT", path: "/products/{productId}", body: {} },
1429
+ delete_product: { method: "DELETE", path: "/products/{productId}", query: ["force"] },
1430
+ // Product Variations
1431
+ list_variations: { method: "GET", path: "/products/{productId}/variations" },
1432
+ create_variation: { method: "POST", path: "/products/{productId}/variations", body: { regular_price: "" } },
1433
+ update_variation: { method: "PUT", path: "/products/{productId}/variations/{variationId}", body: {} },
1434
+ // Product Categories
1435
+ create_category: { method: "POST", path: "/products/categories", body: { name: "" } },
1436
+ list_categories: { method: "GET", path: "/products/categories", query: ["per_page", "page", "search"] },
1437
+ get_category: { method: "GET", path: "/products/categories/{categoryId}" },
1438
+ update_category: { method: "PUT", path: "/products/categories/{categoryId}", body: {} },
1439
+ delete_category: { method: "DELETE", path: "/products/categories/{categoryId}" },
1440
+ // Orders
1441
+ create_order: { method: "POST", path: "/orders", body: { payment_method: "", billing: {}, line_items: [] } },
1442
+ list_orders: { method: "GET", path: "/orders", query: ["per_page", "page", "status", "customer", "after", "before", "orderby", "order"] },
1443
+ get_order: { method: "GET", path: "/orders/{orderId}" },
1444
+ update_order: { method: "PUT", path: "/orders/{orderId}", body: {} },
1445
+ delete_order: { method: "DELETE", path: "/orders/{orderId}" },
1446
+ // Order Notes
1447
+ create_order_note: { method: "POST", path: "/orders/{orderId}/notes", body: { note: "" } },
1448
+ list_order_notes: { method: "GET", path: "/orders/{orderId}/notes" },
1449
+ // Refunds
1450
+ create_refund: { method: "POST", path: "/orders/{orderId}/refunds", body: { amount: "", reason: "" } },
1451
+ list_refunds: { method: "GET", path: "/orders/{orderId}/refunds" },
1452
+ // Customers
1453
+ create_customer: { method: "POST", path: "/customers", body: { email: "", first_name: "", last_name: "" } },
1454
+ list_customers: { method: "GET", path: "/customers", query: ["per_page", "page", "search", "role", "orderby", "order"] },
1455
+ get_customer: { method: "GET", path: "/customers/{customerId}" },
1456
+ update_customer: { method: "PUT", path: "/customers/{customerId}", body: {} },
1457
+ delete_customer: { method: "DELETE", path: "/customers/{customerId}" },
1458
+ // Coupons
1459
+ create_coupon: { method: "POST", path: "/coupons", body: { code: "", discount_type: "percent", amount: "" } },
1460
+ list_coupons: { method: "GET", path: "/coupons", query: ["per_page", "page", "search"] },
1461
+ get_coupon: { method: "GET", path: "/coupons/{couponId}" },
1462
+ update_coupon: { method: "PUT", path: "/coupons/{couponId}", body: {} },
1463
+ delete_coupon: { method: "DELETE", path: "/coupons/{couponId}" },
1464
+ // Shipping
1465
+ list_shipping_zones: { method: "GET", path: "/shipping/zones" },
1466
+ list_shipping_methods:{ method: "GET", path: "/shipping/zones/{zoneId}/methods" },
1467
+ // Reports
1468
+ sales_report: { method: "GET", path: "/reports/sales", query: ["period", "date_min", "date_max"] },
1469
+ top_sellers_report: { method: "GET", path: "/reports/top_sellers", query: ["period"] },
1470
+ coupons_report: { method: "GET", path: "/reports/coupons/totals" },
1471
+ // Taxes
1472
+ list_tax_classes: { method: "GET", path: "/taxes/classes" },
1473
+ list_tax_rates: { method: "GET", path: "/taxes" },
1474
+ // Settings
1475
+ list_settings: { method: "GET", path: "/settings" },
1476
+ get_setting_group: { method: "GET", path: "/settings/{group}" },
1477
+ },
1478
+ authHeader: (creds) => ({
1479
+ "Authorization": `Basic ${Buffer.from(`${creds.consumerKey}:${creds.consumerSecret}`).toString('base64')}`,
1480
+ "Content-Type": "application/json",
1481
+ }),
1482
+ },
1483
+
1284
1484
  // ── TikTok Ads ──────────────────────────────────────────────
1285
1485
  tiktok_ads: {
1286
1486
  name: "TikTok Ads",
@@ -1539,38 +1739,142 @@ export const SERVICE_CATALOG = {
1539
1739
  pipedrive: {
1540
1740
  name: "Pipedrive",
1541
1741
  type: "crm",
1542
- description: "Sales CRM — deals, persons, organizations, activities, pipelines, notes",
1742
+ description: "Sales CRM — deals, persons, organizations, activities, pipelines, products, leads, goals, projects, files, mail, webhooks, subscriptions, notes, stages, users",
1543
1743
  baseUrl: "https://api.pipedrive.com/v1",
1544
1744
  authType: "api_key",
1545
1745
  credentialKeys: ["apiKey"],
1546
1746
  capabilities: [
1547
- { name: "manage_deals", actions: ["create", "list", "get", "update", "delete"], description: "Full deal lifecycle management" },
1548
- { name: "manage_persons", actions: ["create", "list", "get", "update", "delete"], description: "Manage contact persons" },
1549
- { name: "manage_organizations", actions: ["create", "list", "get"], description: "Manage organizations" },
1550
- { name: "manage_activities", actions: ["create", "list", "get"], description: "Schedule and track activities" },
1551
- { name: "manage_pipelines", actions: ["list", "get"], description: "View sales pipelines and stages" },
1552
- { name: "manage_notes", actions: ["create", "list"], description: "Add and view notes" },
1553
- ],
1554
- endpoints: {
1747
+ { name: "manage_deals", actions: ["create", "list", "get", "update", "delete", "search", "merge", "duplicate"], description: "Full deal lifecycle with merge and duplicate" },
1748
+ { name: "manage_persons", actions: ["create", "list", "get", "update", "delete", "search", "merge"], description: "Contact persons with merge" },
1749
+ { name: "manage_organizations", actions: ["create", "list", "get", "update", "delete", "search", "merge"], description: "Organizations with merge" },
1750
+ { name: "manage_activities", actions: ["create", "list", "get", "update", "delete"], description: "Schedule, track, and manage activities" },
1751
+ { name: "manage_pipelines", actions: ["list", "get", "create", "update", "delete"], description: "Pipeline CRUD + stage management" },
1752
+ { name: "manage_stages", actions: ["list", "get", "create", "update", "delete"], description: "Deal stages within pipelines" },
1753
+ { name: "manage_products", actions: ["create", "list", "get", "update", "delete", "search"], description: "Product catalog management" },
1754
+ { name: "manage_leads", actions: ["create", "list", "get", "update", "delete"], description: "Lead management before conversion to deals" },
1755
+ { name: "manage_notes", actions: ["create", "list", "get", "update", "delete"], description: "Notes on deals, persons, organizations" },
1756
+ { name: "manage_files", actions: ["list", "get", "create", "delete"], description: "File attachments" },
1757
+ { name: "manage_mail", actions: ["list_threads", "get_thread", "list_messages", "send"], description: "Email integration" },
1758
+ { name: "manage_goals", actions: ["create", "list", "get", "update", "delete"], description: "Sales goals and targets" },
1759
+ { name: "manage_projects", actions: ["create", "list", "get", "update"], description: "Project management" },
1760
+ { name: "manage_webhooks", actions: ["create", "list", "delete"], description: "Event webhooks" },
1761
+ { name: "manage_subscriptions", actions: ["create", "list", "get", "update", "cancel"], description: "Recurring revenue subscriptions" },
1762
+ { name: "manage_users", actions: ["list", "get", "update"], description: "Team user management" },
1763
+ ],
1764
+ endpoints: {
1765
+ // Deals
1555
1766
  create_deal: { method: "POST", path: "/deals", query: ["api_token"], body: { title: "" } },
1556
- list_deals: { method: "GET", path: "/deals", query: ["api_token", "start", "limit", "status", "sort"] },
1767
+ list_deals: { method: "GET", path: "/deals", query: ["api_token", "start", "limit", "status", "sort", "filter_id"] },
1557
1768
  get_deal: { method: "GET", path: "/deals/{dealId}", query: ["api_token"] },
1558
1769
  update_deal: { method: "PUT", path: "/deals/{dealId}", query: ["api_token"], body: {} },
1559
1770
  delete_deal: { method: "DELETE", path: "/deals/{dealId}", query: ["api_token"] },
1771
+ search_deals: { method: "GET", path: "/deals/search", query: ["api_token", "term", "fields", "exact_match", "start", "limit"] },
1772
+ merge_deals: { method: "PUT", path: "/deals/{dealId}/merge", query: ["api_token"], body: { merge_with_id: 0 } },
1773
+ duplicate_deal: { method: "POST", path: "/deals/{dealId}/duplicate", query: ["api_token"] },
1774
+ list_deal_activities: { method: "GET", path: "/deals/{dealId}/activities", query: ["api_token", "start", "limit"] },
1775
+ list_deal_files: { method: "GET", path: "/deals/{dealId}/files", query: ["api_token", "start", "limit"] },
1776
+ list_deal_products: { method: "GET", path: "/deals/{dealId}/products", query: ["api_token", "start", "limit"] },
1777
+ add_deal_product: { method: "POST", path: "/deals/{dealId}/products", query: ["api_token"], body: { product_id: 0, item_price: 0, quantity: 1 } },
1778
+ list_deal_participants:{ method: "GET", path: "/deals/{dealId}/participants", query: ["api_token", "start", "limit"] },
1779
+ add_deal_participant: { method: "POST", path: "/deals/{dealId}/participants", query: ["api_token"], body: { person_id: 0 } },
1780
+ list_deal_followers: { method: "GET", path: "/deals/{dealId}/followers", query: ["api_token"] },
1781
+ // Persons
1560
1782
  create_person: { method: "POST", path: "/persons", query: ["api_token"], body: { name: "" } },
1561
- list_persons: { method: "GET", path: "/persons", query: ["api_token", "start", "limit", "sort"] },
1783
+ list_persons: { method: "GET", path: "/persons", query: ["api_token", "start", "limit", "sort", "filter_id"] },
1562
1784
  get_person: { method: "GET", path: "/persons/{personId}", query: ["api_token"] },
1563
1785
  update_person: { method: "PUT", path: "/persons/{personId}", query: ["api_token"], body: {} },
1564
1786
  delete_person: { method: "DELETE", path: "/persons/{personId}", query: ["api_token"] },
1787
+ search_persons: { method: "GET", path: "/persons/search", query: ["api_token", "term", "fields", "exact_match", "start", "limit"] },
1788
+ merge_persons: { method: "PUT", path: "/persons/{personId}/merge", query: ["api_token"], body: { merge_with_id: 0 } },
1789
+ list_person_deals: { method: "GET", path: "/persons/{personId}/deals", query: ["api_token", "start", "limit"] },
1790
+ list_person_activities:{ method: "GET", path: "/persons/{personId}/activities", query: ["api_token", "start", "limit"] },
1791
+ // Organizations
1565
1792
  create_organization: { method: "POST", path: "/organizations", query: ["api_token"], body: { name: "" } },
1566
- list_organizations: { method: "GET", path: "/organizations", query: ["api_token", "start", "limit", "sort"] },
1793
+ list_organizations: { method: "GET", path: "/organizations", query: ["api_token", "start", "limit", "sort", "filter_id"] },
1794
+ get_organization: { method: "GET", path: "/organizations/{orgId}", query: ["api_token"] },
1795
+ update_organization: { method: "PUT", path: "/organizations/{orgId}", query: ["api_token"], body: {} },
1796
+ delete_organization: { method: "DELETE", path: "/organizations/{orgId}", query: ["api_token"] },
1797
+ search_organizations: { method: "GET", path: "/organizations/search", query: ["api_token", "term", "fields", "exact_match"] },
1798
+ merge_organizations: { method: "PUT", path: "/organizations/{orgId}/merge", query: ["api_token"], body: { merge_with_id: 0 } },
1799
+ // Activities
1567
1800
  create_activity: { method: "POST", path: "/activities", query: ["api_token"], body: { subject: "", type: "" } },
1568
- list_activities: { method: "GET", path: "/activities", query: ["api_token", "start", "limit", "type"] },
1801
+ list_activities: { method: "GET", path: "/activities", query: ["api_token", "start", "limit", "type", "user_id", "done"] },
1802
+ get_activity: { method: "GET", path: "/activities/{activityId}", query: ["api_token"] },
1803
+ update_activity: { method: "PUT", path: "/activities/{activityId}", query: ["api_token"], body: {} },
1804
+ delete_activity: { method: "DELETE", path: "/activities/{activityId}", query: ["api_token"] },
1805
+ // Pipelines + Stages
1569
1806
  list_pipelines: { method: "GET", path: "/pipelines", query: ["api_token"] },
1570
1807
  get_pipeline: { method: "GET", path: "/pipelines/{pipelineId}", query: ["api_token"] },
1808
+ create_pipeline: { method: "POST", path: "/pipelines", query: ["api_token"], body: { name: "" } },
1809
+ update_pipeline: { method: "PUT", path: "/pipelines/{pipelineId}", query: ["api_token"], body: {} },
1810
+ delete_pipeline: { method: "DELETE", path: "/pipelines/{pipelineId}", query: ["api_token"] },
1811
+ list_stages: { method: "GET", path: "/stages", query: ["api_token", "pipeline_id"] },
1812
+ get_stage: { method: "GET", path: "/stages/{stageId}", query: ["api_token"] },
1813
+ create_stage: { method: "POST", path: "/stages", query: ["api_token"], body: { name: "", pipeline_id: 0 } },
1814
+ update_stage: { method: "PUT", path: "/stages/{stageId}", query: ["api_token"], body: {} },
1815
+ delete_stage: { method: "DELETE", path: "/stages/{stageId}", query: ["api_token"] },
1816
+ list_stage_deals: { method: "GET", path: "/stages/{stageId}/deals", query: ["api_token", "start", "limit"] },
1817
+ // Products
1818
+ create_product: { method: "POST", path: "/products", query: ["api_token"], body: { name: "" } },
1819
+ list_products: { method: "GET", path: "/products", query: ["api_token", "start", "limit"] },
1820
+ get_product: { method: "GET", path: "/products/{productId}", query: ["api_token"] },
1821
+ update_product: { method: "PUT", path: "/products/{productId}", query: ["api_token"], body: {} },
1822
+ delete_product: { method: "DELETE", path: "/products/{productId}", query: ["api_token"] },
1823
+ search_products: { method: "GET", path: "/products/search", query: ["api_token", "term", "fields"] },
1824
+ // Leads
1825
+ create_lead: { method: "POST", path: "/leads", query: ["api_token"], body: { title: "" } },
1826
+ list_leads: { method: "GET", path: "/leads", query: ["api_token", "start", "limit", "sort", "filter_id"] },
1827
+ get_lead: { method: "GET", path: "/leads/{leadId}", query: ["api_token"] },
1828
+ update_lead: { method: "PATCH", path: "/leads/{leadId}", query: ["api_token"], body: {} },
1829
+ delete_lead: { method: "DELETE", path: "/leads/{leadId}", query: ["api_token"] },
1830
+ // Notes
1571
1831
  create_note: { method: "POST", path: "/notes", query: ["api_token"], body: { content: "" } },
1572
1832
  list_notes: { method: "GET", path: "/notes", query: ["api_token", "start", "limit", "sort"] },
1573
- search_items: { method: "GET", path: "/itemSearch", query: ["api_token", "term", "item_types", "fields"] },
1833
+ get_note: { method: "GET", path: "/notes/{noteId}", query: ["api_token"] },
1834
+ update_note: { method: "PUT", path: "/notes/{noteId}", query: ["api_token"], body: {} },
1835
+ delete_note: { method: "DELETE", path: "/notes/{noteId}", query: ["api_token"] },
1836
+ // Files
1837
+ list_files: { method: "GET", path: "/files", query: ["api_token", "start", "limit", "sort"] },
1838
+ get_file: { method: "GET", path: "/files/{fileId}", query: ["api_token"] },
1839
+ delete_file: { method: "DELETE", path: "/files/{fileId}", query: ["api_token"] },
1840
+ // Mail
1841
+ list_mail_threads: { method: "GET", path: "/mailbox/mailThreads", query: ["api_token", "folder", "start", "limit"] },
1842
+ get_mail_thread: { method: "GET", path: "/mailbox/mailThreads/{threadId}", query: ["api_token"] },
1843
+ list_mail_messages: { method: "GET", path: "/mailbox/mailMessages", query: ["api_token", "start", "limit"] },
1844
+ // Goals
1845
+ create_goal: { method: "POST", path: "/goals", query: ["api_token"], body: { title: "", assignee: {} } },
1846
+ list_goals: { method: "GET", path: "/goals", query: ["api_token"] },
1847
+ get_goal: { method: "GET", path: "/goals/{goalId}", query: ["api_token"] },
1848
+ update_goal: { method: "PUT", path: "/goals/{goalId}", query: ["api_token"], body: {} },
1849
+ delete_goal: { method: "DELETE", path: "/goals/{goalId}", query: ["api_token"] },
1850
+ // Projects
1851
+ create_project: { method: "POST", path: "/projects", query: ["api_token"], body: { title: "", board_id: 0 } },
1852
+ list_projects: { method: "GET", path: "/projects", query: ["api_token", "start", "limit", "status"] },
1853
+ get_project: { method: "GET", path: "/projects/{projectId}", query: ["api_token"] },
1854
+ update_project: { method: "PUT", path: "/projects/{projectId}", query: ["api_token"], body: {} },
1855
+ // Webhooks
1856
+ create_webhook: { method: "POST", path: "/webhooks", query: ["api_token"], body: { subscription_url: "", event_action: "", event_object: "" } },
1857
+ list_webhooks: { method: "GET", path: "/webhooks", query: ["api_token"] },
1858
+ delete_webhook: { method: "DELETE", path: "/webhooks/{webhookId}", query: ["api_token"] },
1859
+ // Subscriptions
1860
+ create_subscription: { method: "POST", path: "/subscriptions/recurring", query: ["api_token"], body: { deal_id: 0, currency: "USD" } },
1861
+ list_subscriptions: { method: "GET", path: "/subscriptions/{dealId}", query: ["api_token"] },
1862
+ get_subscription: { method: "GET", path: "/subscriptions/{subscriptionId}", query: ["api_token"] },
1863
+ update_subscription: { method: "PUT", path: "/subscriptions/recurring/{subscriptionId}", query: ["api_token"], body: {} },
1864
+ cancel_subscription: { method: "DELETE", path: "/subscriptions/recurring/{subscriptionId}", query: ["api_token"] },
1865
+ // Users
1866
+ list_users: { method: "GET", path: "/users", query: ["api_token"] },
1867
+ get_user: { method: "GET", path: "/users/{userId}", query: ["api_token"] },
1868
+ update_user: { method: "PUT", path: "/users/{userId}", query: ["api_token"], body: {} },
1869
+ // Search
1870
+ search_items: { method: "GET", path: "/itemSearch", query: ["api_token", "term", "item_types", "fields", "exact_match", "start", "limit"] },
1871
+ search_field: { method: "GET", path: "/itemSearch/field", query: ["api_token", "term", "field_type", "field_key", "exact_match"] },
1872
+ // Filters
1873
+ list_filters: { method: "GET", path: "/filters", query: ["api_token", "type"] },
1874
+ get_filter: { method: "GET", path: "/filters/{filterId}", query: ["api_token"] },
1875
+ create_filter: { method: "POST", path: "/filters", query: ["api_token"], body: { name: "", type: "", conditions: {} } },
1876
+ // Recents
1877
+ list_recents: { method: "GET", path: "/recents", query: ["api_token", "since_timestamp", "items"] },
1574
1878
  },
1575
1879
  authHeader: (creds) => ({
1576
1880
  "Content-Type": "application/json",
@@ -1581,25 +1885,86 @@ export const SERVICE_CATALOG = {
1581
1885
  linkedin: {
1582
1886
  name: "LinkedIn",
1583
1887
  type: "social",
1584
- description: "Professional network — posts, profile, connections, organizations via LinkedIn API",
1585
- baseUrl: "https://api.linkedin.com/rest",
1586
- authType: "oauth",
1888
+ description: "Professional network — profile, posts, comments, likes, organizations, page analytics, events, advertising, ad reporting via LinkedIn API v2",
1889
+ baseUrl: "https://api.linkedin.com",
1890
+ authType: "oauth2",
1891
+ scopes: ["rw_organization_admin", "w_member_social", "r_profile_basicinfo", "rw_events", "r_ads", "r_basicprofile", "r_organization_admin", "email", "r_1st_connections_size", "openid", "profile", "r_ads_reporting", "r_organization_social", "r_verify", "w_organization_social", "rw_ads", "r_events"],
1587
1892
  credentialKeys: ["access_token"],
1588
1893
  capabilities: [
1589
- { name: "manage_posts", actions: ["create", "list", "delete"], description: "Create and manage posts" },
1590
- { name: "manage_profile", actions: ["get"], description: "View profile information" },
1591
- { name: "manage_connections", actions: ["list"], description: "View connections" },
1592
- { name: "manage_organizations", actions: ["get", "list_posts"], description: "View company pages and posts" },
1593
- ],
1594
- endpoints: {
1595
- create_post: { method: "POST", path: "/posts", body: { author: "", commentary: "", visibility: "PUBLIC", distribution: { feedDistribution: "MAIN_FEED" }, lifecycleState: "PUBLISHED" } },
1596
- get_profile: { method: "GET", path: "/me", query: ["projection"] },
1597
- list_connections: { method: "GET", path: "/connections", query: ["start", "count", "projection"] },
1598
- get_organization: { method: "GET", path: "/organizations/{organizationId}", query: ["projection"] },
1599
- list_org_posts: { method: "GET", path: "/posts", query: ["author", "q", "count", "start"] },
1600
- delete_post: { method: "DELETE", path: "/posts/{postId}" },
1601
- get_post: { method: "GET", path: "/posts/{postId}" },
1602
- upload_image: { method: "POST", path: "/images", query: ["action=initializeUpload"], body: { initializeUploadRequest: { owner: "" } } },
1894
+ { name: "manage_profile", actions: ["get", "get_email", "get_connections", "get_verification", "get_photos"], description: "View profile, email, connections count, verification status, and photos" },
1895
+ { name: "manage_posts", actions: ["create", "get", "delete"], description: "Create, read, and delete posts for members or organizations" },
1896
+ { name: "manage_social_actions", actions: ["comment", "list_comments", "like", "unlike"], description: "Comment on and like/unlike posts" },
1897
+ { name: "manage_shares", actions: ["list"], description: "List shared content" },
1898
+ { name: "manage_media", actions: ["upload_image", "upload_video"], description: "Upload images and videos for posts" },
1899
+ { name: "manage_organizations", actions: ["get", "list_admin_orgs", "update", "get_brand_pages"], description: "View and manage organization pages" },
1900
+ { name: "manage_org_analytics", actions: ["page_stats", "follower_stats", "share_stats", "follower_count", "visitor_stats"], description: "Organization page analytics and statistics" },
1901
+ { name: "manage_ads", actions: ["list_accounts", "get_account", "create_campaign_group", "list_campaign_groups", "create_campaign", "list_campaigns", "update_campaign", "create_creative", "list_creatives", "update_creative"], description: "Manage ad accounts, campaigns, and creatives" },
1902
+ { name: "manage_ad_extras", actions: ["get_analytics", "get_budget_pricing", "create_sponsored_content", "get_targeting", "get_form_responses"], description: "Ad analytics, targeting, budget suggestions, and lead gen forms" },
1903
+ { name: "manage_ad_reporting", actions: ["get_performance", "get_statistics", "get_conversions", "get_budget_reports", "get_inmail_analytics"], description: "Campaign performance metrics, conversion tracking, and InMail analytics" },
1904
+ { name: "manage_events", actions: ["create", "get", "update", "delete", "list_attendees"], description: "Create, manage, and track events and attendees" },
1905
+ ],
1906
+ endpoints: {
1907
+ // ── Profile (5) ───────────────────────────────────────────
1908
+ get_profile: { method: "GET", path: "/v2/me", query: ["projection"] },
1909
+ get_email: { method: "GET", path: "/v2/emailAddress", query: ["q=members", "projection=(elements*(handle~))"] },
1910
+ get_connections_size: { method: "GET", path: "/v2/connections", query: ["q=viewer", "start", "count"] },
1911
+ get_verification: { method: "GET", path: "/v2/profileVerification", query: ["q=member"] },
1912
+ get_profile_pictures: { method: "GET", path: "/v2/profilePictures", query: ["q=member", "projection"] },
1913
+
1914
+ // ── Social / Posts (10) ───────────────────────────────────
1915
+ create_post: { method: "POST", path: "/v2/posts", body: { author: "", commentary: "", visibility: "PUBLIC", distribution: { feedDistribution: "MAIN_FEED" }, lifecycleState: "PUBLISHED" } },
1916
+ get_post: { method: "GET", path: "/v2/posts/{postId}" },
1917
+ delete_post: { method: "DELETE", path: "/v2/posts/{postId}" },
1918
+ add_comment: { method: "POST", path: "/v2/socialActions/{activityId}/comments", body: { actor: "", message: { text: "" } } },
1919
+ list_comments: { method: "GET", path: "/v2/socialActions/{activityId}/comments", query: ["start", "count"] },
1920
+ like_post: { method: "POST", path: "/v2/socialActions/{activityId}/likes", body: { actor: "" } },
1921
+ unlike_post: { method: "DELETE", path: "/v2/socialActions/{activityId}/likes/{likeId}" },
1922
+ list_shares: { method: "GET", path: "/v2/shares", query: ["q", "owners", "count", "start"] },
1923
+ upload_image: { method: "POST", path: "/v2/images", query: ["action=initializeUpload"], body: { initializeUploadRequest: { owner: "" } } },
1924
+ upload_video: { method: "POST", path: "/v2/videos", query: ["action=initializeUpload"], body: { initializeUploadRequest: { owner: "", fileSizeBytes: 0 } } },
1925
+
1926
+ // ── Organization Pages (10) ───────────────────────────────
1927
+ get_organization: { method: "GET", path: "/v2/organizations/{organizationId}", query: ["projection"] },
1928
+ list_admin_orgs: { method: "GET", path: "/v2/organizationalEntityAcls", query: ["q=roleAssignee", "role", "projection"] },
1929
+ create_org_post: { method: "POST", path: "/v2/posts", body: { author: "urn:li:organization:{organizationId}", commentary: "", visibility: "PUBLIC", distribution: { feedDistribution: "MAIN_FEED" }, lifecycleState: "PUBLISHED" } },
1930
+ get_page_statistics: { method: "GET", path: "/v2/organizationPageStatistics", query: ["q=organization", "organization", "timeIntervals"] },
1931
+ get_follower_statistics: { method: "GET", path: "/v2/organizationalEntityFollowerStatistics", query: ["q=organizationalEntity", "organizationalEntity", "timeIntervals"] },
1932
+ get_share_statistics: { method: "GET", path: "/v2/organizationalEntityShareStatistics", query: ["q=organizationalEntity", "organizationalEntity", "shares"] },
1933
+ get_follower_count: { method: "GET", path: "/v2/networkSizes/{organizationUrn}", query: ["edgeType=CompanyFollowedByMember"] },
1934
+ update_organization: { method: "PUT", path: "/v2/organizations/{organizationId}", body: {} },
1935
+ get_brand_pages: { method: "GET", path: "/v2/organizationBrandPages", query: ["q=parentOrganization", "parentOrganization"] },
1936
+ get_visitor_statistics: { method: "GET", path: "/v2/organizationPageVisitorStatistics", query: ["q=organization", "organization", "timeIntervals"] },
1937
+
1938
+ // ── Advertising (15) ──────────────────────────────────────
1939
+ list_ad_accounts: { method: "GET", path: "/v2/adAccountsV2", query: ["q=search", "search", "count", "start"] },
1940
+ get_ad_account: { method: "GET", path: "/v2/adAccountsV2/{adAccountId}" },
1941
+ create_campaign_group: { method: "POST", path: "/v2/adCampaignGroupsV2", body: { account: "", name: "", status: "ACTIVE" } },
1942
+ list_campaign_groups: { method: "GET", path: "/v2/adCampaignGroupsV2", query: ["q=search", "search", "count", "start"] },
1943
+ create_campaign: { method: "POST", path: "/v2/adCampaignsV2", body: { account: "", campaignGroup: "", name: "", type: "SPONSORED_UPDATES", costType: "CPM", status: "PAUSED" } },
1944
+ list_campaigns: { method: "GET", path: "/v2/adCampaignsV2", query: ["q=search", "search", "count", "start"] },
1945
+ update_campaign: { method: "PATCH", path: "/v2/adCampaignsV2/{campaignId}", body: {} },
1946
+ create_creative: { method: "POST", path: "/v2/adCreativesV2", body: { campaign: "", reference: "" } },
1947
+ list_creatives: { method: "GET", path: "/v2/adCreativesV2", query: ["q=search", "search", "campaigns", "count"] },
1948
+ update_creative: { method: "PATCH", path: "/v2/adCreativesV2/{creativeId}", body: {} },
1949
+ get_ad_analytics: { method: "GET", path: "/v2/adAnalyticsV2", query: ["q=analytics", "dateRange", "campaigns", "pivot", "timeGranularity", "fields"] },
1950
+ get_budget_pricing: { method: "GET", path: "/v2/adBudgetPricingV2", query: ["account", "campaign", "bidType", "match"] },
1951
+ create_sponsored_content: { method: "POST", path: "/v2/adDirectSponsoredContents", body: { account: "", owner: "", content: {} } },
1952
+ get_targeting_facets: { method: "GET", path: "/v2/adTargetingFacets", query: ["q=search", "search", "queryType"] },
1953
+ get_form_responses: { method: "GET", path: "/v2/adFormResponses", query: ["q=account", "account", "versionedLeadGenFormUrn", "count", "start"] },
1954
+
1955
+ // ── Ad Reporting (5) ──────────────────────────────────────
1956
+ get_performance_metrics: { method: "GET", path: "/v2/adAnalyticsV2", query: ["q=analytics", "dateRange", "accounts", "campaigns", "creatives", "pivot", "timeGranularity", "fields"] },
1957
+ get_aggregate_statistics: { method: "GET", path: "/v2/adAnalyticsV2", query: ["q=statistics", "accounts", "dateRange", "fields"] },
1958
+ get_conversion_tracking: { method: "GET", path: "/v2/conversionTrackingV2", query: ["q=account", "account", "count", "start"] },
1959
+ get_budget_reports: { method: "GET", path: "/v2/adBudgetV2", query: ["q=account", "account", "count", "start"] },
1960
+ get_inmail_analytics: { method: "GET", path: "/v2/adInMailContentV2", query: ["q=account", "account", "campaign", "count", "start"] },
1961
+
1962
+ // ── Events (5) ────────────────────────────────────────────
1963
+ create_event: { method: "POST", path: "/v2/events", body: { organizer: "", name: { locale: { language: "en", country: "US" }, value: "" }, description: {}, startAt: "", endAt: "" } },
1964
+ get_event: { method: "GET", path: "/v2/events/{eventId}" },
1965
+ update_event: { method: "PUT", path: "/v2/events/{eventId}", body: {} },
1966
+ delete_event: { method: "DELETE", path: "/v2/events/{eventId}" },
1967
+ list_event_attendees: { method: "GET", path: "/v2/eventAttendees", query: ["q=event", "event", "count", "start"] },
1603
1968
  },
1604
1969
  authHeader: (creds) => ({
1605
1970
  "Authorization": `Bearer ${creds.access_token}`,
@@ -2899,6 +3264,74 @@ export const SERVICE_CATALOG = {
2899
3264
  authHeader: (creds) => ({ "Authorization": `Bearer ${creds.apiKey}`, "Content-Type": "application/json" }),
2900
3265
  },
2901
3266
 
3267
+ // ── CloudConvert ────────────────────────────────────────────────
3268
+ cloudconvert: {
3269
+ name: "CloudConvert",
3270
+ type: "utility",
3271
+ description: "File conversion API — convert between 200+ formats (PDF, DOCX, PNG, MP4, etc.), optimize, merge, capture websites, create thumbnails",
3272
+ baseUrl: "https://api.cloudconvert.com/v2",
3273
+ authType: "apiKey",
3274
+ credentialKeys: ["apiKey"],
3275
+ capabilities: [
3276
+ "convert files between 200+ formats",
3277
+ "merge PDFs and documents",
3278
+ "optimize images and PDFs",
3279
+ "capture website screenshots",
3280
+ "create thumbnails from documents",
3281
+ "extract text from PDFs (OCR)",
3282
+ "convert spreadsheets to CSV/JSON",
3283
+ "watermark PDFs",
3284
+ "compress videos",
3285
+ "manage conversion jobs and tasks",
3286
+ ],
3287
+ endpoints: {
3288
+ // Jobs (multi-step conversion pipelines)
3289
+ create_job: { method: "POST", path: "/jobs", body: { tasks: {} } },
3290
+ list_jobs: { method: "GET", path: "/jobs", query: ["status", "tag", "per_page", "page"] },
3291
+ get_job: { method: "GET", path: "/jobs/{jobId}" },
3292
+ delete_job: { method: "DELETE", path: "/jobs/{jobId}" },
3293
+ wait_job: { method: "GET", path: "/jobs/{jobId}/wait" },
3294
+
3295
+ // Tasks
3296
+ create_task: { method: "POST", path: "/tasks", body: { operation: "", input: "" } },
3297
+ list_tasks: { method: "GET", path: "/tasks", query: ["status", "operation", "job_id", "per_page", "page"] },
3298
+ get_task: { method: "GET", path: "/tasks/{taskId}" },
3299
+ delete_task: { method: "DELETE", path: "/tasks/{taskId}" },
3300
+ wait_task: { method: "GET", path: "/tasks/{taskId}/wait" },
3301
+ cancel_task: { method: "POST", path: "/tasks/{taskId}/cancel" },
3302
+ retry_task: { method: "POST", path: "/tasks/{taskId}/retry" },
3303
+
3304
+ // Conversion operations
3305
+ convert: { method: "POST", path: "/convert", body: { input: "", input_format: "", output_format: "" } },
3306
+ optimize: { method: "POST", path: "/optimize", body: { input: "", input_format: "" } },
3307
+ capture_website: { method: "POST", path: "/capture-website", body: { url: "", output_format: "pdf" } },
3308
+ create_thumbnail: { method: "POST", path: "/thumbnail", body: { input: "", output_format: "png" } },
3309
+ merge: { method: "POST", path: "/merge", body: { input: [], output_format: "pdf" } },
3310
+ create_archive: { method: "POST", path: "/archive", body: { input: [], output_format: "zip" } },
3311
+ watermark: { method: "POST", path: "/watermark", body: { input: "", input_format: "pdf" } },
3312
+ metadata: { method: "POST", path: "/metadata", body: { input: "", input_format: "" } },
3313
+
3314
+ // Import/Export (file transfer)
3315
+ import_url: { method: "POST", path: "/import/url", body: { url: "" } },
3316
+ import_upload: { method: "POST", path: "/import/upload" },
3317
+ import_s3: { method: "POST", path: "/import/s3", body: { bucket: "", region: "", key: "" } },
3318
+ import_google_cloud: { method: "POST", path: "/import/google-cloud-storage", body: { bucket: "", key: "" } },
3319
+ export_url: { method: "POST", path: "/export/url", body: { input: "" } },
3320
+ export_s3: { method: "POST", path: "/export/s3", body: { input: "", bucket: "", region: "", key: "" } },
3321
+ export_google_cloud: { method: "POST", path: "/export/google-cloud-storage", body: { input: "", bucket: "", key: "" } },
3322
+
3323
+ // Users & Usage
3324
+ get_user: { method: "GET", path: "/users/me" },
3325
+ get_balance: { method: "GET", path: "/users/me/balance" },
3326
+
3327
+ // Webhooks
3328
+ create_webhook: { method: "POST", path: "/webhooks", body: { url: "", events: [] } },
3329
+ list_webhooks: { method: "GET", path: "/webhooks" },
3330
+ delete_webhook: { method: "DELETE", path: "/webhooks/{webhookId}" },
3331
+ },
3332
+ authHeader: (creds) => ({ "Authorization": `Bearer ${creds.apiKey}`, "Content-Type": "application/json" }),
3333
+ },
3334
+
2902
3335
  };
2903
3336
 
2904
3337
  // ── Helpers ────────────────────────────────────────────────
@@ -0,0 +1,440 @@
1
+ /**
2
+ * 0n Knowledge Layers — Patent #5 Prototype Implementation
3
+ *
4
+ * User-Configurable Multi-Layer AI Knowledge Architecture
5
+ * with Cross-Platform Portable Deployment and Automatic
6
+ * Capability Discovery via Service Connection
7
+ *
8
+ * US Provisional Patent — RocketOpp LLC
9
+ * Inventor: Michael A. Mento Jr.
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ // ── Layer Taxonomy (K1-K7) ──────────────────────────────────────────
15
+
16
+ const LAYER_SCHEMA = {
17
+ brand_voice: {
18
+ id: 'K1',
19
+ name: 'Brand Voice',
20
+ description: 'Brand identity, tone, communication style',
21
+ composition: 'override', // User layer replaces defaults entirely
22
+ fields: ['tone', 'formality', 'humor', 'vocabulary_additions', 'vocabulary_prohibitions', 'style_rules', 'personality_attributes'],
23
+ },
24
+ terminology: {
25
+ id: 'K2',
26
+ name: 'Terminology',
27
+ description: 'Business-specific terms, acronyms, slang',
28
+ composition: 'merge', // User values merge with defaults
29
+ fields: ['acronyms', 'proper_nouns', 'slang', 'corrections', 'industry_terms'],
30
+ },
31
+ business_structure: {
32
+ id: 'K3',
33
+ name: 'Business Structure',
34
+ description: 'Organizational context, services, team',
35
+ composition: 'merge',
36
+ fields: ['business_name', 'phone', 'email', 'address', 'hours', 'timezone', 'team', 'departments', 'services', 'pricing'],
37
+ },
38
+ visual_identity: {
39
+ id: 'K4',
40
+ name: 'Visual Identity',
41
+ description: 'Brand colors, typography, visual preferences',
42
+ composition: 'override',
43
+ fields: ['primary_color', 'secondary_color', 'accent_color', 'font_display', 'font_body', 'logo_url', 'icon_style', 'theme_preference'],
44
+ },
45
+ domain_knowledge: {
46
+ id: 'K5',
47
+ name: 'Domain Knowledge',
48
+ description: 'Industry expertise, FAQs, procedures',
49
+ composition: 'append', // Adds to defaults, never removes
50
+ fields: ['faq_pairs', 'procedures', 'compliance', 'best_practices', 'competitive_positioning', 'unique_selling_points'],
51
+ },
52
+ credentials: {
53
+ id: 'K6',
54
+ name: 'Credentials',
55
+ description: 'API keys, tokens, service endpoints',
56
+ composition: 'replace', // User layer is sole source
57
+ fields: ['api_keys', 'oauth_tokens', 'webhook_urls', 'mcp_configs', 'service_endpoints'],
58
+ encrypted: true, // Double-encrypted via Argon2id per 0nVault patent
59
+ },
60
+ operational_context: {
61
+ id: 'K7',
62
+ name: 'Operational Context',
63
+ description: 'Runtime state, history, active workflows',
64
+ composition: 'append',
65
+ fields: ['active_workflows', 'recent_interactions', 'pending_tasks', 'calendar_state', 'pipeline_state', 'seasonal_context'],
66
+ system_managed: true, // Updated automatically, not user-edited
67
+ },
68
+ };
69
+
70
+ // ── Known Credential Patterns ───────────────────────────────────────
71
+
72
+ const CREDENTIAL_PATTERNS = [
73
+ { pattern: /^sk-ant-/, service: 'anthropic', name: 'Anthropic API Key' },
74
+ { pattern: /^sk-[a-zA-Z0-9]{48}/, service: 'openai', name: 'OpenAI API Key' },
75
+ { pattern: /^rk_live_/, service: 'stripe', name: 'Stripe Secret Key' },
76
+ { pattern: /^pk_live_/, service: 'stripe', name: 'Stripe Publishable Key' },
77
+ { pattern: /^whsec_/, service: 'stripe', name: 'Stripe Webhook Secret' },
78
+ { pattern: /^pit-[a-f0-9-]{36}$/, service: 'crm', name: 'CRM PIT Token' },
79
+ { pattern: /^xoxb-/, service: 'slack', name: 'Slack Bot Token' },
80
+ { pattern: /^xoxp-/, service: 'slack', name: 'Slack User Token' },
81
+ { pattern: /^gsk_/, service: 'groq', name: 'Groq API Key' },
82
+ { pattern: /^SG\./, service: 'sendgrid', name: 'SendGrid API Key' },
83
+ { pattern: /^AC[a-f0-9]{32}$/, service: 'twilio', name: 'Twilio Account SID' },
84
+ { pattern: /^ghp_/, service: 'github', name: 'GitHub Personal Access Token' },
85
+ { pattern: /^gho_/, service: 'github', name: 'GitHub OAuth Token' },
86
+ { pattern: /^eyJ[A-Za-z0-9_-]+\.eyJ/, service: 'supabase', name: 'Supabase JWT' },
87
+ { pattern: /^AKIA[A-Z0-9]{16}$/, service: 'aws', name: 'AWS Access Key' },
88
+ { pattern: /^AIza[A-Za-z0-9_-]{35}$/, service: 'google', name: 'Google API Key' },
89
+ { pattern: /^re_[A-Za-z0-9]+$/, service: 'resend', name: 'Resend API Key' },
90
+ ];
91
+
92
+ // ── Knowledge Layer Manager ─────────────────────────────────────────
93
+
94
+ class KnowledgeLayers {
95
+
96
+ constructor(locationId) {
97
+ this.locationId = locationId;
98
+ this.layers = {};
99
+ this.completion = { total: 0, filled: 0, pct: 0, missing: [] };
100
+ }
101
+
102
+ /**
103
+ * Load layers from vault data.
104
+ */
105
+ load(vaultData) {
106
+ for (const [key, schema] of Object.entries(LAYER_SCHEMA)) {
107
+ this.layers[key] = {
108
+ ...schema,
109
+ data: vaultData?.[key] || {},
110
+ version: vaultData?.[key]?._version || 1,
111
+ updated_at: vaultData?.[key]?._updated_at || null,
112
+ };
113
+ }
114
+ return this;
115
+ }
116
+
117
+ /**
118
+ * Update a specific field in a layer.
119
+ */
120
+ updateField(layerKey, field, value) {
121
+ if (!this.layers[layerKey]) throw new Error(`Unknown layer: ${layerKey}`);
122
+ if (!this.layers[layerKey].data) this.layers[layerKey].data = {};
123
+ this.layers[layerKey].data[field] = value;
124
+ this.layers[layerKey].version++;
125
+ this.layers[layerKey].updated_at = new Date().toISOString();
126
+ return this;
127
+ }
128
+
129
+ /**
130
+ * Compose layers using the defined strategies.
131
+ * Merges user data with defaults according to each layer's composition type.
132
+ */
133
+ compose(defaults = {}) {
134
+ const result = {};
135
+
136
+ for (const [key, layer] of Object.entries(this.layers)) {
137
+ const userLayer = layer.data || {};
138
+ const defaultLayer = defaults[key] || {};
139
+ const strategy = layer.composition;
140
+
141
+ switch (strategy) {
142
+ case 'override':
143
+ // User layer completely replaces default
144
+ result[key] = Object.keys(userLayer).length > 0 ? userLayer : defaultLayer;
145
+ break;
146
+
147
+ case 'merge':
148
+ // Merge: user values take precedence for duplicate keys
149
+ result[key] = { ...defaultLayer, ...userLayer };
150
+ break;
151
+
152
+ case 'append':
153
+ // Append: combine arrays, merge objects, user values added
154
+ result[key] = {};
155
+ for (const field of new Set([...Object.keys(defaultLayer), ...Object.keys(userLayer)])) {
156
+ const dv = defaultLayer[field];
157
+ const uv = userLayer[field];
158
+ if (Array.isArray(dv) && Array.isArray(uv)) {
159
+ result[key][field] = [...dv, ...uv];
160
+ } else if (typeof dv === 'object' && typeof uv === 'object' && dv && uv) {
161
+ result[key][field] = { ...dv, ...uv };
162
+ } else {
163
+ result[key][field] = uv !== undefined ? uv : dv;
164
+ }
165
+ }
166
+ break;
167
+
168
+ case 'replace':
169
+ // Replace: user layer only, ignore defaults
170
+ result[key] = userLayer;
171
+ break;
172
+
173
+ default:
174
+ result[key] = { ...defaultLayer, ...userLayer };
175
+ }
176
+ }
177
+
178
+ return result;
179
+ }
180
+
181
+ /**
182
+ * Resolve cross-layer template references.
183
+ * "Always refer to {{business_structure.business_name}} in full"
184
+ * → "Always refer to The Spa In Ligonier in full"
185
+ */
186
+ resolveReferences(text, composedLayers) {
187
+ return text.replace(/\{\{(\w+)\.(\w+)\}\}/g, (match, layerKey, field) => {
188
+ const layer = composedLayers[layerKey];
189
+ if (layer && layer[field] !== undefined) {
190
+ return String(layer[field]);
191
+ }
192
+ return match; // Keep unresolved references as-is
193
+ });
194
+ }
195
+
196
+ /**
197
+ * Adapt composed layers to a specific platform format.
198
+ */
199
+ adaptForPlatform(platform, composedLayers) {
200
+ const adapters = {
201
+ 'openai': () => this._adaptOpenAI(composedLayers),
202
+ 'anthropic': () => this._adaptAnthropic(composedLayers),
203
+ 'gemini': () => this._adaptGemini(composedLayers),
204
+ 'ollama': () => this._adaptOllama(composedLayers),
205
+ 'mcp': () => this._adaptMCP(composedLayers),
206
+ 'wordpress': () => this._adaptWordPress(composedLayers),
207
+ 'slack': () => this._adaptSlack(composedLayers),
208
+ 'system_prompt': () => this._adaptSystemPrompt(composedLayers),
209
+ };
210
+
211
+ const adapter = adapters[platform] || adapters['system_prompt'];
212
+ return adapter();
213
+ }
214
+
215
+ // ── Platform Adapters ───────────────────────────────────────────
216
+
217
+ _adaptSystemPrompt(layers) {
218
+ let prompt = '';
219
+
220
+ // K1: Brand Voice
221
+ if (layers.brand_voice?.tone) {
222
+ prompt += `## Communication Style\nTone: ${layers.brand_voice.tone}\n`;
223
+ if (layers.brand_voice.formality !== undefined) prompt += `Formality level: ${layers.brand_voice.formality}/1.0\n`;
224
+ if (layers.brand_voice.style_rules?.length) {
225
+ prompt += 'Rules:\n' + layers.brand_voice.style_rules.map(r => `- ${r}`).join('\n') + '\n';
226
+ }
227
+ if (layers.brand_voice.vocabulary_prohibitions?.length) {
228
+ prompt += `Never use: ${layers.brand_voice.vocabulary_prohibitions.join(', ')}\n`;
229
+ }
230
+ prompt += '\n';
231
+ }
232
+
233
+ // K2: Terminology
234
+ if (layers.terminology?.acronyms && Object.keys(layers.terminology.acronyms).length) {
235
+ prompt += '## Terminology\n';
236
+ for (const [abbr, full] of Object.entries(layers.terminology.acronyms)) {
237
+ prompt += `- ${abbr} = ${full}\n`;
238
+ }
239
+ if (layers.terminology.proper_nouns) {
240
+ for (const [noun, rule] of Object.entries(layers.terminology.proper_nouns)) {
241
+ prompt += `- "${noun}": ${rule}\n`;
242
+ }
243
+ }
244
+ prompt += '\n';
245
+ }
246
+
247
+ // K3: Business Structure
248
+ if (layers.business_structure?.business_name) {
249
+ prompt += '## Business Information\n';
250
+ const bs = layers.business_structure;
251
+ if (bs.business_name) prompt += `Business: ${bs.business_name}\n`;
252
+ if (bs.phone) prompt += `Phone: ${bs.phone}\n`;
253
+ if (bs.email) prompt += `Email: ${bs.email}\n`;
254
+ if (bs.address) prompt += `Address: ${bs.address}\n`;
255
+ if (bs.hours) prompt += `Hours: ${JSON.stringify(bs.hours)}\n`;
256
+ if (bs.services?.length) {
257
+ prompt += '\nServices:\n';
258
+ for (const svc of bs.services) {
259
+ prompt += `- ${svc.name}${svc.price ? ` (${svc.price})` : ''}${svc.duration ? ` — ${svc.duration}` : ''}\n`;
260
+ }
261
+ }
262
+ prompt += '\n';
263
+ }
264
+
265
+ // K5: Domain Knowledge
266
+ if (layers.domain_knowledge?.faq_pairs?.length) {
267
+ prompt += '## FAQ\n';
268
+ for (const faq of layers.domain_knowledge.faq_pairs) {
269
+ prompt += `Q: ${faq.q}\nA: ${faq.a}\n\n`;
270
+ }
271
+ }
272
+
273
+ return { type: 'system_prompt', content: prompt.trim() };
274
+ }
275
+
276
+ _adaptOpenAI(layers) {
277
+ const systemPrompt = this._adaptSystemPrompt(layers);
278
+ // OpenAI GPTs have 128K context — we can include everything
279
+ return {
280
+ type: 'openai_gpt',
281
+ instructions: systemPrompt.content,
282
+ knowledge_files: this._extractKnowledgeFiles(layers),
283
+ };
284
+ }
285
+
286
+ _adaptAnthropic(layers) {
287
+ const systemPrompt = this._adaptSystemPrompt(layers);
288
+ return {
289
+ type: 'anthropic_project',
290
+ system: systemPrompt.content,
291
+ project_knowledge: this._extractKnowledgeFiles(layers),
292
+ };
293
+ }
294
+
295
+ _adaptGemini(layers) {
296
+ const systemPrompt = this._adaptSystemPrompt(layers);
297
+ // Gemini Gems have 4K char limit — truncate by priority
298
+ const truncated = systemPrompt.content.substring(0, 4000);
299
+ return {
300
+ type: 'gemini_gem',
301
+ instructions: truncated,
302
+ truncated: systemPrompt.content.length > 4000,
303
+ original_length: systemPrompt.content.length,
304
+ };
305
+ }
306
+
307
+ _adaptOllama(layers) {
308
+ const systemPrompt = this._adaptSystemPrompt(layers);
309
+ return {
310
+ type: 'ollama_brain',
311
+ system: systemPrompt.content,
312
+ brain_file: this._generateBrainFile(layers),
313
+ };
314
+ }
315
+
316
+ _adaptMCP(layers) {
317
+ const systemPrompt = this._adaptSystemPrompt(layers);
318
+ return {
319
+ type: 'mcp_context',
320
+ system_prefix: systemPrompt.content,
321
+ tool_context: layers.credentials || {},
322
+ };
323
+ }
324
+
325
+ _adaptWordPress(layers) {
326
+ const systemPrompt = this._adaptSystemPrompt(layers);
327
+ return {
328
+ type: 'wordpress_onpress',
329
+ chat_system_prompt: systemPrompt.content,
330
+ theme_colors: layers.visual_identity || {},
331
+ business_info: layers.business_structure || {},
332
+ };
333
+ }
334
+
335
+ _adaptSlack(layers) {
336
+ const systemPrompt = this._adaptSystemPrompt(layers);
337
+ return {
338
+ type: 'slack_bot',
339
+ bot_personality: systemPrompt.content,
340
+ slash_commands: this._generateSlashCommands(layers),
341
+ };
342
+ }
343
+
344
+ _extractKnowledgeFiles(layers) {
345
+ const files = [];
346
+ if (layers.domain_knowledge?.procedures?.length) {
347
+ files.push({ name: 'procedures.md', content: layers.domain_knowledge.procedures.join('\n\n---\n\n') });
348
+ }
349
+ if (layers.domain_knowledge?.faq_pairs?.length) {
350
+ const faqContent = layers.domain_knowledge.faq_pairs.map(f => `## ${f.q}\n\n${f.a}`).join('\n\n');
351
+ files.push({ name: 'faq.md', content: faqContent });
352
+ }
353
+ return files;
354
+ }
355
+
356
+ _generateBrainFile(layers) {
357
+ return {
358
+ format: '0n-brain-v1',
359
+ layers: Object.fromEntries(
360
+ Object.entries(layers).filter(([k]) => k !== 'credentials')
361
+ ),
362
+ generated_at: new Date().toISOString(),
363
+ };
364
+ }
365
+
366
+ _generateSlashCommands(layers) {
367
+ const commands = ['/0n help'];
368
+ if (layers.business_structure?.services?.length) commands.push('/0n services');
369
+ if (layers.business_structure?.hours) commands.push('/0n hours');
370
+ if (layers.credentials?.api_keys?.stripe) commands.push('/0n invoice');
371
+ return commands;
372
+ }
373
+ }
374
+
375
+ // ── Credential Harvester ────────────────────────────────────────────
376
+
377
+ class CredentialHarvester {
378
+
379
+ /**
380
+ * Analyze a set of key-value pairs and identify credentials.
381
+ * Works with .env files, JSON configs, process.env, etc.
382
+ */
383
+ static harvest(keyValuePairs) {
384
+ const discovered = [];
385
+
386
+ for (const [key, value] of Object.entries(keyValuePairs)) {
387
+ if (!value || typeof value !== 'string') continue;
388
+
389
+ for (const pattern of CREDENTIAL_PATTERNS) {
390
+ if (pattern.pattern.test(value)) {
391
+ discovered.push({
392
+ key,
393
+ service: pattern.service,
394
+ name: pattern.name,
395
+ value_preview: value.substring(0, 8) + '...',
396
+ // Actual value stored only in encrypted K6 layer
397
+ });
398
+ break;
399
+ }
400
+ }
401
+ }
402
+
403
+ return discovered;
404
+ }
405
+
406
+ /**
407
+ * Verify a discovered credential by making a health-check API call.
408
+ */
409
+ static async verify(service, value) {
410
+ const healthChecks = {
411
+ anthropic: () => fetch('https://api.anthropic.com/v1/messages', {
412
+ method: 'POST', headers: { 'x-api-key': value, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' },
413
+ body: JSON.stringify({ model: 'claude-haiku-4-5-20251001', max_tokens: 1, messages: [{ role: 'user', content: 'hi' }] }),
414
+ }),
415
+ openai: () => fetch('https://api.openai.com/v1/models', { headers: { Authorization: `Bearer ${value}` } }),
416
+ stripe: () => fetch('https://api.stripe.com/v1/balance', { headers: { Authorization: `Bearer ${value}` } }),
417
+ groq: () => fetch('https://api.groq.com/openai/v1/models', { headers: { Authorization: `Bearer ${value}` } }),
418
+ github: () => fetch('https://api.github.com/user', { headers: { Authorization: `Bearer ${value}` } }),
419
+ };
420
+
421
+ const check = healthChecks[service];
422
+ if (!check) return { verified: false, reason: 'No health check available' };
423
+
424
+ try {
425
+ const res = await check();
426
+ return { verified: res.status < 400, status: res.status };
427
+ } catch (err) {
428
+ return { verified: false, reason: err.message };
429
+ }
430
+ }
431
+ }
432
+
433
+ // ── Exports ─────────────────────────────────────────────────────────
434
+
435
+ module.exports = {
436
+ LAYER_SCHEMA,
437
+ CREDENTIAL_PATTERNS,
438
+ KnowledgeLayers,
439
+ CredentialHarvester,
440
+ };
package/lib/stats.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "generated": "2026-03-29T20:40:55.698Z",
2
+ "generated": "2026-04-03T09:50:10.449Z",
3
3
  "catalogVersion": "2.2.0",
4
4
  "services": 48,
5
5
  "tools": 545,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0nmcp",
3
- "version": "2.9.2",
3
+ "version": "3.0.0",
4
4
  "mcpName": "io.github.0nork/0nMCP",
5
5
  "description": "Universal AI API Orchestrator — 819 tools, 48 services, portable AI Brain bundles + machine-bound vault encryption + Application Engine. The most comprehensive MCP server available. Free and open source from 0nORK.",
6
6
  "type": "module",
@@ -205,6 +205,6 @@
205
205
  "triggers": 155,
206
206
  "totalCapabilities": 1078,
207
207
  "categories": 21,
208
- "lastUpdated": "2026-03-29T20:40:55.698Z"
208
+ "lastUpdated": "2026-04-03T09:50:10.449Z"
209
209
  }
210
210
  }