clawskills-mcp 0.3.5 → 0.4.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/package.json +7 -3
- package/skills/ROADMAP.md +2 -2
- package/skills/asana/skill.md +30 -0
- package/skills/hubspot/skill.md +61 -0
- package/skills/jira/skill.md +30 -0
- package/skills/salesforce/skill.md +45 -0
- package/skills/zendesk/skill.md +52 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clawskills-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "MCP server exposing ClawSkills API integration skill docs to AI agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "ClawSkills Contributors",
|
|
@@ -33,8 +33,12 @@
|
|
|
33
33
|
"skills/"
|
|
34
34
|
],
|
|
35
35
|
"scripts": {
|
|
36
|
-
"
|
|
37
|
-
"
|
|
36
|
+
"sync:skills": "node scripts/sync-skills.mjs",
|
|
37
|
+
"check:skills": "node scripts/check-skills.mjs",
|
|
38
|
+
"check:freshness": "node scripts/check-skills.mjs --freshness",
|
|
39
|
+
"check:docs": "node scripts/check-docs.mjs",
|
|
40
|
+
"prepack": "npm run sync:skills",
|
|
41
|
+
"build": "npm run sync:skills && tsc",
|
|
38
42
|
"start": "node dist/index.js",
|
|
39
43
|
"dev": "ts-node src/index.ts",
|
|
40
44
|
"test": "vitest run",
|
package/skills/ROADMAP.md
CHANGED
|
@@ -19,7 +19,7 @@ This skill set enables end-to-end automation and integration across the most com
|
|
|
19
19
|
| Layer | Status |
|
|
20
20
|
|-------|--------|
|
|
21
21
|
| **14 skill docs** — Monday.com, Salesforce, Jira, Dynamics 365, HubSpot, ServiceNow, Zendesk, Asana, GitHub, Figma, Slack, Stripe, Notion, Linear | ✅ Live |
|
|
22
|
-
| **MCP server** — `clawskills-mcp` v0.3.
|
|
22
|
+
| **MCP server** — `clawskills-mcp` v0.3.6 on npm; `list_skills`, `get_skill`, `search_skills` | ✅ Live |
|
|
23
23
|
| **CI pipeline** — build + test on every push/PR via `ci.yml` | ✅ Live |
|
|
24
24
|
| **Release automation** — `release.yml` workflow_dispatch → bump, tag, npm publish via OIDC | ✅ Live |
|
|
25
25
|
| **Test suite** — Vitest unit tests + real-skills validation (required sections, ≥5 KB, all 14 tools) | ✅ Live |
|
|
@@ -83,7 +83,7 @@ The repo now needs tighter alignment between the canonical `skills/` directory,
|
|
|
83
83
|
| Channel | Status | Next action |
|
|
84
84
|
|---------|--------|-------------|
|
|
85
85
|
| GitHub (public) | Ready to flip | Make repo public |
|
|
86
|
-
| npm (`clawskills-mcp`) | ✅ Live — v0.3.
|
|
86
|
+
| npm (`clawskills-mcp`) | ✅ Live — v0.3.6 | Maintain via `release.yml` |
|
|
87
87
|
| MCP registry listings | Not submitted | Submit to glama.ai, mcp.so, smithery.ai after public launch |
|
|
88
88
|
| Docs website | Planned | Mintlify — fastest path to SEO-friendly browsable docs |
|
|
89
89
|
| Lane A vs B | TBD | Revisit after first traction signals from public launch |
|
package/skills/asana/skill.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Asana Skill
|
|
2
2
|
|
|
3
|
+
> **Last validated:** 2026-02-19 | **API:** Asana REST API 1.0
|
|
4
|
+
> **REST base URL:** `https://app.asana.com/api/1.0`
|
|
5
|
+
> **Assumed product:** Asana cloud. Enterprise controls, SCIM, and admin APIs may require additional scopes and plan-specific access.
|
|
6
|
+
|
|
3
7
|
## What this skill enables
|
|
4
8
|
|
|
5
9
|
- Automatically create, assign, and structure tasks from any external intake channel (forms, emails, Slack messages, webhook events) so work is captured without manual entry.
|
|
@@ -681,6 +685,32 @@ curl -X POST \
|
|
|
681
685
|
|
|
682
686
|
---
|
|
683
687
|
|
|
688
|
+
### Cross-tool recipe: HubSpot Deal Won -> Asana project kickoff
|
|
689
|
+
|
|
690
|
+
**Goal:** Start onboarding or implementation work in Asana when a HubSpot Deal reaches `closedwon`.
|
|
691
|
+
|
|
692
|
+
**Flow:**
|
|
693
|
+
1. Receive a HubSpot webhook for `deal.propertyChange`.
|
|
694
|
+
2. Confirm the new `dealstage` maps to closed-won in the target pipeline.
|
|
695
|
+
3. Fetch the Deal, associated Company, and primary Contact from HubSpot.
|
|
696
|
+
4. Create the Asana task or project in the correct team or project template.
|
|
697
|
+
5. Store the Asana `task_gid` or `project_gid` back in HubSpot or in your integration DB.
|
|
698
|
+
|
|
699
|
+
**Suggested Asana fields:**
|
|
700
|
+
|
|
701
|
+
| Asana field | Source |
|
|
702
|
+
|---|---|
|
|
703
|
+
| `name` | `Onboard {dealname}` |
|
|
704
|
+
| `notes` | Deal URL, customer, ARR, owner, launch context |
|
|
705
|
+
| `assignee` | mapped CSM or implementation owner |
|
|
706
|
+
| `due_on` | kickoff or target launch date |
|
|
707
|
+
| `custom_fields` | plan, ARR, onboarding tier, deal ID |
|
|
708
|
+
|
|
709
|
+
**Operational guardrails:**
|
|
710
|
+
- Prevent duplicates by checking your mapping store before creating a new Asana record.
|
|
711
|
+
- If you use a project template, create the project once and then create the kickoff task inside it.
|
|
712
|
+
- HubSpot webhooks are at-least-once delivery; your creation path must be idempotent.
|
|
713
|
+
|
|
684
714
|
## Query patterns & filtering
|
|
685
715
|
|
|
686
716
|
### Task search
|
package/skills/hubspot/skill.md
CHANGED
|
@@ -390,6 +390,67 @@ GET https://api.hubapi.com/crm/v3/imports/{importId}
|
|
|
390
390
|
# importStatus: STARTED → PROCESSING → DONE
|
|
391
391
|
```
|
|
392
392
|
|
|
393
|
+
**When to use Imports vs batch endpoints:**
|
|
394
|
+
- Use `batch/create` or `batch/update` for API-driven writes where you already have structured JSON and need immediate responses.
|
|
395
|
+
- Use Imports for backfills, CSV-based migrations, or cases where users export flat files from another system.
|
|
396
|
+
|
|
397
|
+
**Partial failure handling:**
|
|
398
|
+
- Imports can finish with row-level failures even when the job completes successfully.
|
|
399
|
+
- Always inspect the import summary and error rows before marking the source batch as complete.
|
|
400
|
+
- Treat duplicate email collisions as data-quality events, not transient API failures.
|
|
401
|
+
|
|
402
|
+
**Batch write guardrails:**
|
|
403
|
+
- Max 100 inputs per batch request.
|
|
404
|
+
- For large syncs, shard into batches of 100 and apply a short concurrency limit so you do not burst into 429s.
|
|
405
|
+
- Search first when deduplicating by email; batch create is not idempotent.
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
### Cross-tool recipe: Salesforce Lead -> HubSpot Contact sync
|
|
410
|
+
|
|
411
|
+
**Goal:** Mirror new or updated Salesforce Leads into HubSpot Contacts for marketing and lifecycle automation.
|
|
412
|
+
|
|
413
|
+
**HubSpot-side pattern:**
|
|
414
|
+
1. Search Contacts by `email`.
|
|
415
|
+
2. If found, `PATCH /crm/v3/objects/contacts/{id}` with mapped fields.
|
|
416
|
+
3. If not found, `POST /crm/v3/objects/contacts`.
|
|
417
|
+
4. Optionally stamp a custom property like `salesforce_lead_id` so future reconciliations do not depend solely on email.
|
|
418
|
+
|
|
419
|
+
**Recommended property mapping:**
|
|
420
|
+
|
|
421
|
+
| HubSpot Contact | Source from Salesforce |
|
|
422
|
+
|---|---|
|
|
423
|
+
| `email` | `Lead.Email` |
|
|
424
|
+
| `firstname` | `Lead.FirstName` |
|
|
425
|
+
| `lastname` | `Lead.LastName` |
|
|
426
|
+
| `company` | `Lead.Company` |
|
|
427
|
+
| `phone` | `Lead.Phone` |
|
|
428
|
+
| `lifecyclestage` | derived mapping from lead status |
|
|
429
|
+
|
|
430
|
+
**Failure policy:**
|
|
431
|
+
- `400` validation errors: quarantine the record with the source Lead ID and failing field names.
|
|
432
|
+
- `409` or duplicate conflicts: re-run a search by email, then update the winning Contact instead of creating a second record.
|
|
433
|
+
- `429`: respect `Retry-After` and retry the shard, not the full sync job.
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
### Cross-tool recipe: HubSpot Deal Won -> Asana project kickoff
|
|
438
|
+
|
|
439
|
+
**Goal:** When a Deal enters `closedwon`, create onboarding work in Asana.
|
|
440
|
+
|
|
441
|
+
**Flow:**
|
|
442
|
+
1. Subscribe to `deal.propertyChange` for `dealstage`.
|
|
443
|
+
2. Filter for the pipeline stage representing "closed won".
|
|
444
|
+
3. Fetch the Deal plus associated Company and primary Contact.
|
|
445
|
+
4. Create the Asana task or project with the customer name, ARR, owner, and launch date.
|
|
446
|
+
5. Store the resulting Asana `gid` in HubSpot or in your integration DB.
|
|
447
|
+
|
|
448
|
+
**Minimum payload to send to Asana:**
|
|
449
|
+
- `name`: `Onboard {dealname}`
|
|
450
|
+
- `notes`: include the HubSpot deal URL, company, close date, and owner
|
|
451
|
+
- `due_on`: derived from kickoff SLA or launch date
|
|
452
|
+
- `custom_fields`: ARR, segment, onboarding tier, source deal ID
|
|
453
|
+
|
|
393
454
|
---
|
|
394
455
|
|
|
395
456
|
## Query patterns & filtering
|
package/skills/jira/skill.md
CHANGED
|
@@ -462,6 +462,36 @@ The `expand=transitions.fields` parameter returns the fields required for each t
|
|
|
462
462
|
|
|
463
463
|
---
|
|
464
464
|
|
|
465
|
+
### Cross-tool recipe: Zendesk Ticket -> Jira Bug escalation
|
|
466
|
+
|
|
467
|
+
**Goal:** Create or update a Jira Bug when a Zendesk ticket meets escalation criteria.
|
|
468
|
+
|
|
469
|
+
**Escalation trigger examples:**
|
|
470
|
+
- Zendesk ticket priority becomes `urgent`
|
|
471
|
+
- Tag includes `engineering`
|
|
472
|
+
- Custom field indicates product defect
|
|
473
|
+
|
|
474
|
+
**Flow:**
|
|
475
|
+
1. Receive the Zendesk webhook or poll Incremental Export.
|
|
476
|
+
2. Build a deterministic external key, for example `zendesk:{ticket_id}`.
|
|
477
|
+
3. Search Jira for an existing issue with that external key in a custom field or label.
|
|
478
|
+
4. If found, update severity, assignee, and status. If not found, create a Bug with the Zendesk URL in the description.
|
|
479
|
+
5. Post the Jira issue key back to Zendesk as an internal note or custom field.
|
|
480
|
+
|
|
481
|
+
**Minimum field mapping:**
|
|
482
|
+
|
|
483
|
+
| Zendesk | Jira |
|
|
484
|
+
|---|---|
|
|
485
|
+
| `subject` | `summary` |
|
|
486
|
+
| `description` / latest public comment | `description` (ADF) |
|
|
487
|
+
| `priority` | `priority` |
|
|
488
|
+
| `ticket id` | custom external ID field |
|
|
489
|
+
| `tags` | `labels` |
|
|
490
|
+
|
|
491
|
+
**Status sync recommendation:**
|
|
492
|
+
- One-way sync into Jira is safer initially.
|
|
493
|
+
- Add reverse Jira -> Zendesk status updates only after you define an explicit state map and conflict rules.
|
|
494
|
+
|
|
465
495
|
## Query patterns & filtering
|
|
466
496
|
|
|
467
497
|
### JQL incremental sync
|
|
@@ -378,10 +378,28 @@ curl -s "$BASE/services/data/v66.0/jobs/ingest/$JOB_ID" \
|
|
|
378
378
|
# Step 5 — retrieve failed records
|
|
379
379
|
curl -s "$BASE/services/data/v66.0/jobs/ingest/$JOB_ID/failedResults" \
|
|
380
380
|
-H "Authorization: Bearer $TOKEN"
|
|
381
|
+
|
|
382
|
+
# Step 6 — retrieve successful and unprocessed records for reconciliation
|
|
383
|
+
curl -s "$BASE/services/data/v66.0/jobs/ingest/$JOB_ID/successfulResults" \
|
|
384
|
+
-H "Authorization: Bearer $TOKEN"
|
|
385
|
+
|
|
386
|
+
curl -s "$BASE/services/data/v66.0/jobs/ingest/$JOB_ID/unprocessedRecords" \
|
|
387
|
+
-H "Authorization: Bearer $TOKEN"
|
|
381
388
|
```
|
|
382
389
|
|
|
383
390
|
**When to use Bulk API v2:** >1,000 records. For <1,000 records, REST is simpler and faster.
|
|
384
391
|
|
|
392
|
+
**CSV and job design tips:**
|
|
393
|
+
- Keep one object type per job. Do not mix Leads and Contacts in the same ingest file.
|
|
394
|
+
- Include only columns you intend to write. Extra CSV columns are treated as field references and can fail the row.
|
|
395
|
+
- Shard very large backfills into multiple jobs so a single failure does not block the full dataset.
|
|
396
|
+
- Reconcile with all three result streams: `successfulResults`, `failedResults`, and `unprocessedRecords`.
|
|
397
|
+
|
|
398
|
+
**Partial-failure policy:**
|
|
399
|
+
- Retry only `unprocessedRecords` automatically.
|
|
400
|
+
- Send `failedResults` to a remediation queue with the Salesforce error message and original source key.
|
|
401
|
+
- Do not advance the upstream source cursor until every row is either successful or quarantined.
|
|
402
|
+
|
|
385
403
|
---
|
|
386
404
|
|
|
387
405
|
### Recipe 8: Register a Change Data Capture (CDC) subscription
|
|
@@ -410,6 +428,33 @@ def handler(event):
|
|
|
410
428
|
|
|
411
429
|
---
|
|
412
430
|
|
|
431
|
+
### Cross-tool recipe: Salesforce Lead -> HubSpot Contact sync
|
|
432
|
+
|
|
433
|
+
**Goal:** Create or update a HubSpot Contact whenever a Salesforce Lead is created or updated, deduplicating by email.
|
|
434
|
+
|
|
435
|
+
**Flow:**
|
|
436
|
+
1. Query Salesforce Leads modified since the last sync boundary using `LastModifiedDate`.
|
|
437
|
+
2. Skip records with blank `Email` or `IsConverted = true`.
|
|
438
|
+
3. In HubSpot, search by `email` first. If found, `PATCH` the Contact. If not, create it.
|
|
439
|
+
4. Store the mapping `Lead.Id -> HubSpot contact id` in your integration DB, but treat `email` as the primary dedup key.
|
|
440
|
+
5. Write a sync marker back to Salesforce only after the HubSpot write succeeds.
|
|
441
|
+
|
|
442
|
+
**Field mapping (minimum viable):**
|
|
443
|
+
|
|
444
|
+
| Salesforce Lead | HubSpot Contact |
|
|
445
|
+
|---|---|
|
|
446
|
+
| `Email` | `email` |
|
|
447
|
+
| `FirstName` | `firstname` |
|
|
448
|
+
| `LastName` | `lastname` |
|
|
449
|
+
| `Company` | `company` |
|
|
450
|
+
| `Phone` | `phone` |
|
|
451
|
+
| `LeadSource` | `lead_source` or custom property |
|
|
452
|
+
|
|
453
|
+
**Operational guardrails:**
|
|
454
|
+
- Prefer a watermark sync (`LastModifiedDate >= cursor`) plus a small overlap window to avoid missed updates.
|
|
455
|
+
- Do not use Bulk API v2 for near-real-time sync unless you are processing a large backfill.
|
|
456
|
+
- If HubSpot rejects one record, quarantine that record and continue the rest of the sync batch.
|
|
457
|
+
|
|
413
458
|
## Query patterns & filtering
|
|
414
459
|
|
|
415
460
|
### SOQL reference patterns
|
package/skills/zendesk/skill.md
CHANGED
|
@@ -493,6 +493,11 @@ curl -u "agent@example.com/token:TOKEN" \
|
|
|
493
493
|
|
|
494
494
|
**Validation**: Poll job status to `completed`. Spot-check 5 random ticket IDs from the batch to confirm `assignee_id` updated correctly.
|
|
495
495
|
|
|
496
|
+
**Operational notes:**
|
|
497
|
+
- Use `update_many` for homogeneous changes like tags, assignee, or status across a known set of ticket IDs.
|
|
498
|
+
- Keep request batches at 100 IDs max and persist the returned `job_status_id`.
|
|
499
|
+
- If the job partially succeeds, re-run only the failed IDs after inspecting the job result.
|
|
500
|
+
|
|
496
501
|
---
|
|
497
502
|
|
|
498
503
|
### Recipe 8: Manage agent permissions and group membership
|
|
@@ -542,6 +547,39 @@ curl -u "admin@example.com/token:TOKEN" \
|
|
|
542
547
|
|
|
543
548
|
---
|
|
544
549
|
|
|
550
|
+
### Cross-tool recipe: Zendesk Ticket -> Jira Bug escalation
|
|
551
|
+
|
|
552
|
+
**Goal**: Escalate a Zendesk ticket into Jira when support confirms the issue is a product defect.
|
|
553
|
+
|
|
554
|
+
**Trigger examples**:
|
|
555
|
+
- Agent adds tag `engineering`
|
|
556
|
+
- Ticket priority changes to `urgent`
|
|
557
|
+
- Custom field `issue_type` becomes `bug`
|
|
558
|
+
|
|
559
|
+
**Flow**:
|
|
560
|
+
1. Capture the Zendesk event via webhook or Incremental Export.
|
|
561
|
+
2. Build a stable external key such as `zendesk:{ticket_id}`.
|
|
562
|
+
3. Search Jira for an existing issue using that key in a custom field or label.
|
|
563
|
+
4. If no issue exists, create a Jira Bug with the Zendesk URL, customer impact, and reproduction details.
|
|
564
|
+
5. Write the Jira issue key back to Zendesk as an internal note or custom field so agents can track engineering progress.
|
|
565
|
+
|
|
566
|
+
**Minimum field mapping**:
|
|
567
|
+
|
|
568
|
+
| Zendesk ticket field | Jira field |
|
|
569
|
+
|---|---|
|
|
570
|
+
| `subject` | `summary` |
|
|
571
|
+
| latest public comment | `description` |
|
|
572
|
+
| `priority` | `priority` |
|
|
573
|
+
| `tags` | `labels` |
|
|
574
|
+
| `id` | external ID field / label |
|
|
575
|
+
|
|
576
|
+
**Operational guardrails**:
|
|
577
|
+
- Make the create path idempotent; webhooks can be retried.
|
|
578
|
+
- Keep status sync one-way at first. Bi-directional sync needs an explicit state map and conflict resolution policy.
|
|
579
|
+
- Post only sanitized customer context into Jira if Zendesk comments may include PII.
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
545
583
|
## Query patterns & filtering
|
|
546
584
|
|
|
547
585
|
### Search API
|
|
@@ -602,6 +640,13 @@ GET /api/v2/incremental/tickets.json?start_time=1708300800
|
|
|
602
640
|
- Also available for users and organizations: `/api/v2/incremental/users.json`, `/api/v2/incremental/organizations.json`.
|
|
603
641
|
- Events include `deleted` tickets — check `status` field.
|
|
604
642
|
|
|
643
|
+
**Production sync pattern:**
|
|
644
|
+
1. Start with `start_time` at least 5 minutes in the past.
|
|
645
|
+
2. Continue following the returned window until you have drained the stream for the current run.
|
|
646
|
+
3. Persist the returned `end_time`, not your request timestamp.
|
|
647
|
+
4. Re-run with a small overlap window to protect against delayed indexing and consumer crashes.
|
|
648
|
+
5. Deduplicate by ticket `id` and latest `updated_at` in your sink.
|
|
649
|
+
|
|
605
650
|
### Sorting
|
|
606
651
|
|
|
607
652
|
Search API: `&sort_by=created_at&sort_order=asc` (or `desc`).
|
|
@@ -648,6 +693,13 @@ def zendesk_request(method, url, **kwargs):
|
|
|
648
693
|
raise Exception("Exceeded retry budget")
|
|
649
694
|
```
|
|
650
695
|
|
|
696
|
+
### Bulk update and export guardrails
|
|
697
|
+
|
|
698
|
+
- `update_many` is efficient for operational changes across up to 100 tickets, but it is not a substitute for a full sync.
|
|
699
|
+
- Poll the returned job status before assuming the bulk update succeeded.
|
|
700
|
+
- For analytics or warehouse sync, use Incremental Export rather than paginating Search or list endpoints.
|
|
701
|
+
- Keep writes and reads separate: use `update_many` for operational changes, Incremental Export for system-of-record ingestion.
|
|
702
|
+
|
|
651
703
|
### Retry vs fail-fast
|
|
652
704
|
|
|
653
705
|
| HTTP Status | Action |
|