Skip to content

chore: prepare v1.9.0 release#57

Open
drewburchfield wants to merge 14 commits into
mainfrom
dev
Open

chore: prepare v1.9.0 release#57
drewburchfield wants to merge 14 commits into
mainfrom
dev

Conversation

@drewburchfield

@drewburchfield drewburchfield commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Summary

  • Prepare v1.9.0 package, registry, Docker, MCPB, and navigator plugin metadata for the read API parity release.
  • Pin the navigator plugin runtime to help-scout-mcp-server@1.9.0 and refresh stale 17-tool guidance.
  • Add v1.9.0 release notes/checklist, clean up scanner signal, and fix production dependency audit for form-data.

Testing

  • npm run type-check
  • npm run lint
  • npm run build
  • npm test -- --runInBand --silent
  • npm pack --dry-run
  • package tarball install smoke
  • npm run mcpb:pack
  • npm run test:contract
  • npm run test:docker:ci
  • npm run test:docker
  • npm run dogfood:seed
  • npm run dogfood:full
  • npm audit --omit=dev
  • npm run security
  • npm run security:full

No tag, npm publish, Docker publish, or GitHub release has been cut from this branch.

Closes NAS-1297


Open in Devin Review

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

…tent redaction

(a) Add MCP annotations { readOnlyHint, openWorldHint } to all 102 tools via
    listTools() map, so clients (e.g. CoWork) can auto-approve read-only calls.
(b) Fix cache falsy-miss: guard on !== undefined (not truthiness) in cache.ts,
    helpscout-client.ts, helpscout-docs-client.ts so a cached 0/''/false/null
    payload is a hit, not a redundant API call. Fixed the test mock that had
    encoded the same bug (get: () => null -> undefined).
(c) Route the 4 conversation search tools through redactConversationListContent
    so REDACT_MESSAGE_CONTENT (now an opt-in context-saver, not a security
    boundary) consistently trims the preview snippet, matching detail tools.

Tests: cache falsy + readOnly-annotations assertions added. type-check/lint/
build/mcpb-validation green.
The Mailbox v2 API has no size/pageSize param (page size fixed at 25 for
conversations/threads, 50 elsewhere); size is silently ignored. Tools sent
size= and returned truncated data while advertising larger limits.

- Add HelpScoutClient.getAllPages() page-loop helper. Safe when an endpoint
  returns no page block (totalPages defaults to 1) -> single page, no over-fetch.
- getThreads / getThreadsV3: loop all pages so message history is complete
  (was silently <=25); report totalThreads + truncated instead of fake nextPage.
- getConversationSummary: derive first/latest over ALL threads, not first 25.
- searchInboxes: scan all inbox pages so a name match past page 1 is found.
- listAllInboxes: loop pages up to limit; report real totalInboxes + truncated.
- Strip the ignored size= from all conversation-search params (full search
  page-loop lands with the NAS-1298 rewrite).

Tests rewritten to assert the real win (cross-page completeness). 389 pass;
only the pre-existing package-scripts local-.env test fails.
…format)

First consolidation slice. format: 'json'|'rfc822' selects the Accept header
server-side. Removes the duplicate tool (102 -> 101). Updated mcp.json,
extension manifest, and tests to match.
…nversations

Merge advancedConversationSearch, comprehensiveConversationSearch, and
structuredConversationFilter into one query-aware searchConversations. It now
compiles convenience filters (contentTerms->body, subjectTerms->subject,
email/emailDomain, customerIds, hasAttachments, assignedTo=-1->Unassigned) into
the documented query=() syntax and passes folder/assigned_to/number/
modifiedSince as documented top-level params. Status supports all/open.

Removes 3 redundant tools + their dead helpers (searchSingleStatus,
formatComprehensiveSearchResults, etc.) and 3 input schemas. The 4-search-tool
surface was the #1 agent wrong-tool-selection trap (navigator plugin shipped
DANGER docs to disambiguate them).

98 tools (was 101). Tests repointed to searchConversations + new focused tests
asserting the compiled query syntax. type-check/lint/build green; 370 pass.
…cape query terms

Reports: getCompanyReport, getConversationsReport, getProductivityReport,
getUserReport, getHappinessReport, getChannelReport(channel), getDocsReport.
Each routes by a report/channel discriminator to the documented /reports/* path,
forwarding only the params that path documents (start/end/previous*/mailboxes/
tags/types/folders + per-report viewBy/officeHours/page/rows/range/sort). Removes
25 tools + their schemas/handlers/cases.

Also fixes a MEDIUM query-injection flagged by security review: searchConversations
now escapes backslash/quote in contentTerms/subjectTerms/email/emailDomain before
interpolating into the query=() syntax (customerIds are zod-enforced ints; raw
query is a documented power-user passthrough).

73 tools (was 98). type-check/lint/build green; 375 pass.
…stomerContacts

getCustomerContacts already fetches address/emails/phones/chats/social-profiles/
websites in parallel (strict superset), so getCustomerAddress + the 5
listCustomer* tools were redundant. Removed them + schemas/cases; repointed tests
to getCustomerContacts (no data access lost). 67 tools (was 73). All green.
- getConversationV3/getThreadsV3 -> getConversation/getThreads with an intent-named
  includeSystemActors flag (routes to v3 when true). Drops the leaky
  preserveSystemUsers concept flagged by the multi-model review.
- listCustomersV3 -> listCustomers with useV3/cursor (keeps both v2 page and v3
  cursor pagination; v3-only email/createdSince preserved).
- searchInboxes -> listAllInboxes(nameContains) (deprecated tool removed).

63 tools (was 67). type-check/lint/build green; 376 pass.
getInbox gains include: ('fields'|'folders'|'routing')[] and fans out server-side
(Promise.allSettled, per-sub-resource includeErrors). One call returns the inbox
plus its custom fields / folders / routing. Removes listInboxCustomFields,
listInboxFolders, getInboxRouting. 60 tools (was 63). All green.
… into parents

- getUser/listUsers: includeStatus/includeStatuses (fetch /users/{id}/status and
  /users/status) + includeSystemActors (v3 /system-users). Removes getUserStatus,
  listUserStatuses, listSystemUsers, getSystemUser.
- getDocsSite: includeRestrictions (fetch /sites/{id}/restricted, secret-redacted).
  Removes getDocsSiteRestrictions.

55 tools (was 60). Consolidation complete: 102 -> 55 (-46%). All green.
drewburchfield and others added 3 commits June 17, 2026 07:13
…nputSchema

Code review caught a lost-capability regression: the merged searchConversations
supported contentTerms/subjectTerms/email/emailDomain/customerIds/hasAttachments/
folderId/assignedTo/conversationNumber/modifiedSince in its Zod schema + handler,
but the *advertised* inputSchema only listed the original params — so LLM clients
(which build calls from inputSchema, not Zod) couldn't discover them, defeating
the 4->1 merge. Added all 10 to the inputSchema, fixed the status enum
(adds all/open) and sort enum, switched page/limit to integer. Also strip a
leading @ from emailDomain. Regression test added.
…olidation

v1.9.0: tool-surface consolidation (102→55) + read-API hardening
…ol surface

The consolidation updated the jest unit tests but not the live CI harnesses
(dogfood:mcp, dogfood:workflows, test:forensic) which npm test doesn't cover —
they still named the 47 removed tools, failing CI.

- mcp-client-dogfood.ts: EXPECTED_TOOLS -> 55; repointed all per-tool scenarios.
- integration-workflows.ts: repointed search/inbox scenarios to searchConversations
  / listAllInboxes(nameContains); scenario 4 searches body OR subject (the seeded
  term is in the subject); scenario 12 asserts results.length.
- test-all-tools-edge-cases.ts: repointed 16 test() calls; updated 3 validation
  tests whose rejection behavior no longer exists (structuredConversationFilter
  unique-field requirement, searchInboxes query-required) to expect success;
  quote-injection test moved onto searchConversations' escaping.
- prompts/index.ts: prompt copy points to merged tools.

Verified live: dogfood:full 20/20 + discovery, test:forensic 78/78, jest 384.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant